嘿伙计们,我正试图在中途停止承诺链(捕获后)。因此,在第一个承诺发生错误后,catch将捕获它,但我不希望链继续。我正在使用蓝鸟。我该怎么做?
getRedirectedURL(url).then(function(url) {
console.log(1);
url = domainCleanse(url);
sql = mysql.format(select, url);
return [ url, mysqlQuery(sql) ];
}).catch(function(error) {
console.log(2);
console.error(error);
socket.emit('error:unreachable', url + ' was unreachable');
}).spread(function(url, rows) {
console.log(3);
if(_.isEmpty(rows[0])) {
socketList.push({
url: url,
ttl: _.now(),
socket: socket,
added: false
});
} else {
socket.emit('done', mapResults(rows[0]));
}
}).catch(function(error) {
console.log(4);
console.error(error);
socket.emit('error', 'We could not reach ' + url + ' at this time.');
});
答案 0 :(得分:1)
概括您的示例,它看起来像这样:
promiseToFoo()
.then(promiseToBar)
.catch(failedToFooOrBar)
.then(promiseToFrob)
.catch(failedToFrob)
沿着幸福的道路,你向Foo,然后到Bar,然后到Frob。根据您的描述,您希望处理错误Fooing或Barring与错误Frobbing分开处理。因此,一个简单的解决方案是将Frob的错误处理埋没到该承诺中。因此,你没有链接对Frob的承诺,而是将Frob 和的承诺链接到Frobbing中的错误。像这样:
promiseToFoo()
.then(promiseToBar)
.catch(function (error) {
failedToFooOrBar(error);
return Promise.reject(error);
})
.then(function (x) {
return promiseToFrob(x).catch(failedToFrob);
});
这样做的一个关键是确保第一个catch
中的拒绝处理程序最终离开链时处于拒绝状态。这是在上面的示例中通过从处理程序返回被拒绝的Promise来处理的。您也可以通过从处理程序中抛出一个错误来处理它。如果你不做其中的一件事,那么当处理程序完成并且后续then
调用提供的on-fulfill处理程序将被调用时,promise将处于一个完成状态。