问个Promise问题
发布于 8 年前 作者 im-here 4376 次浏览 来自 问答

用的是bluebird

function main() {
  return f1().then(val=>{
    if(val===null)
        return null;//我想要的是如果这里得到的值为null,那么就中断整个链,并把这个结果返回,否则继续后面的操作
    else
        return 100;
  }).then(val=>{
    //继续后面操作
  });
};
12 回复

reject or throw an error

@zzhcch 这样确实可以中断,但是这样就是error了,我并不想要error。

function main() {
  return f1().then(val=>{
    if(val===null) {
      return bluebird.reject(null); // 我想要的是如果这里得到的值为null,那么就中断整个链,并把这个结果返回,否则继续后面的操作
    } else {
      return 100;
    }
  }).then(val=>{
    //继续后面操作
  }).catch(err => {
    return null;
  });
};

取决于你后面的操作是什么,如果是同步操作则没必要继续then了,如下:

function main() {
  return f1().then(val=>{
    if(val===null)
        return null;//我想要的是如果这里得到的值为null,那么就中断整个链,并把这个结果返回,否则继续后面的操作
    else
        用100继续后面操作;
  });
};

如果后面的操作也是异步promise链条,则可以嵌套到else里面:

function main() {
  return f1().then(val=>{
    if(val===null)
        return null;//我想要的是如果这里得到的值为null,那么就中断整个链,并把这个结果返回,否则继续后面的操作
    else
        return Promise.resolve(100).then(...).then(...)
  });
};

为什么不试试co+generator+promise呢

function * gen(resolve) {
	let val = yiled f1();
	if(val === null){
		return resolve(null)
	}
	//如果不为空,对val进行别的操作...
}
 //main函数,依旧返回一个promise
 function main(){
	return new Promise(function(resolve, reject){
		co(gen, resolve).catch(err=>reject(err))
	});
 }
//调用main函数
 main().then(data=>console.log(data)).catch(err=>console.error(err));

其实你这种Promise调用链中间中断的,我觉得使用generator函数去写,最容易理解,并且符合常规的理解~

@tiant167 这样好像可行。不过跑到catch里了 总个人感觉是捕捉到错误了。

@chrischjh 后面是异步操作,我现在就是这样嵌套的

@hyj1991 关键是老项目,用的node版本还是0.x的版本。。。

@imhered 没事吧,对外面调用的 function 来说是无感知的

@tiant167 但是如果该函数体里面真的 throw error 的话,就catch不到了。

@imhered catch 可以区分 error,比如 null 这里的 reject 可以用 AssertionError。可以看下 bluebird catch 的文档 http://bluebirdjs.com/docs/api/catch.html

@tiant167 好的,谢谢!

回到顶部