CNode

问个Promise问题

问答
Iim-here发布于10 年前最后回复10 年前12 回复4918 浏览0 收藏

用的是bluebird

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

回复 (12)

Z
zzhcch#1·10 年前

reject or throw an error

I
im-here#2·10 年前
引用 zzhcchreject or throw an error

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

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

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

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

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

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

为什么不试试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函数去写,最容易理解,并且符合常规的理解~

I
im-here#6·10 年前
引用 tiant167

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

I
im-here#8·10 年前
T
tiant167#9·10 年前
引用 im-here@tiant167 这样好像可行。不过跑到catch里了 总个人感觉是捕捉到错误了。

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

I
im-here#10·10 年前
引用 tiant167@imhered 没事吧,对外面调用的 function 来说是无感知的

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

T
tiant167#11·10 年前
引用 im-here@tiant167 但是如果该函数体里面真的 throw error 的话,就catch不到了。

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

参与回复
登录后即可参与回复。登录