我的问题:从其Promise对象分离处理是否安全?
如果我这样做...
var promise1 = new Promise(function(resolve, reject) {
var json = { "counter":0 }
console.log('execute now, worry later ...')
json.counter++;
console.log(json.counter)
resolve(json);
});
var then = function() {
promise1.then(function(value) { console.log('value: '+value.counter) });
}
setTimeout(then, 3000);
var promise2 = new Promise(function(resolve, reject) {
console.log('error thrown here ...')
throw new Error('will it behave the same as with then?');
});
var catchFunc = function() {
promise2.then().catch(function(error) { console.log('error: '+error.message) });
}
setTimeout(catchFunc, 3000);
然后我得到了有意义的警告...
execute now, worry later ...
1
error thrown here ...
(node:9748) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: will it behave the same as with then?
(node:9748) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)
value: 1
error: will it behave the same as with then?
背景:在某些情况下,我希望我的诺言能够同时执行。在某些情况下,我希望它们按顺序运行。我发现的最简单的实现是将两个变体都包装到一个函数中,将其推送到映射中,并在reduce中处理“ then / catch”。结果是,在第一个变体中(同时),我的处理是在包装时和上面的示例中分离的时候进行的。
如果安全,如何从日志中删除警告?
答案 0 :(得分:2)
被拒绝的承诺应与catch
链接在同一刻度上。如果没有发生,将显示UnhandledPromiseRejectionWarning
。预计它将在下一节点版本中成为例外,因此应避免使用它。
一旦引入了诺言控制流程,使用诺言将是有益的。 setTimeout
脱颖而出,不为诺言提供错误处理。
如果承诺是同时处理的,则通常使用Promise.all(...).catch(...)
处理它们。在这种情况下,所产生的承诺将与catch
链接在同一刻度上(this answer中解决了类似的问题)。