问个Promise问题
用的是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 好的,谢谢!