这样做的动机是能够捕获结束.catch
的所有可能错误,甚至是初始同步代码中发生的错误。
我想像我这样开始我的承诺链:
const bbPromise = require('bluebird');
bbPromise.do(() => {
someTask(); // Could throw
return someVar.doSomeOtherTaskAsync();
})
.then((result) => {
// Do something with result
})
.catch((err) => {
console.log('err: ', err);
});
是否有类似bbPromise.do
功能的功能? bbPromise.resolve
只是给了我传入的整个lambda函数,未执行。
我知道我可以这样做:
bbPromise.bind({}).then(() => {
someTask(); // Could throw
return someVar.doSomeOtherTaskAsync();
})
...
甚至:
new bbPromise((resolve, reject) => {
someTask(); // Could throw
return someVar.doSomeOtherTaskAsync().then(resolve).catch(reject);
})
...
但这些是间接的。有没有一种好方法可以通过执行一个可以返回一个promise的函数来启动一个promise链,并且在结尾.catch
中捕获了错误?
答案 0 :(得分:5)
听起来你正在寻找Promise.try
。 Promise.resolve
适用于已有值且想要从中构建一个promise链的情况,但是如果要运行一些可能抛出的代码,请改用Promise.try
。
try
接受并执行一个函数,以与then
相同的方式处理任何同步异常。你最终会得到类似的东西:
bbPromise.try(someTask).then(() => {
return someVar.doSomeOtherTaskAsync();
}).then((result) => {
// Do something with result
}).catch((err) => {
console.log('err: ', err);
});