承诺:异步处理可以吗?

时间:2018-07-09 07:18:38

标签: node.js promise

我的问题:从其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”。结果是,在第一个变体中(同时),我的处理是在包装时和上面的示例中分离的时候进行的。

如果安全,如何从日志中删除警告?

1 个答案:

答案 0 :(得分:2)

被拒绝的承诺应与catch链接在同一刻度上。如果没有发生,将显示UnhandledPromiseRejectionWarning。预计它将在下一节点版本中成为例外,因此应避免使用它。

一旦引入了诺言控制流程,使用诺言将是有益的。 setTimeout脱颖而出,不为诺言提供错误处理。

如果承诺是同时处理的,则通常使用Promise.all(...).catch(...)处理它们。在这种情况下,所产生的承诺将与catch链接在同一刻度上(this answer中解决了类似的问题)。