【问题标题】:Promises: is asynchronous handling OK?Promises:异步处理可以吗?
【发布时间】:2018-12-16 19:25:52
【问题描述】:

我的问题:从 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?

背景:在某些情况下,我希望我的承诺同时运行。在某些情况下,我希望它们按顺序运行。我发现的最简单的实现是将两个变体包装到一个函数中,将其推送到 map 中,然后在 reduce 中处理“then/catch”。结果是我在第一个变体中的处理(同时)是在包装和分离时,如我上面的示例所示。

如果它是安全的,我怎样才能从我的日志中删除警告?

【问题讨论】:

  • 嗨 Amadan,我认为您的评论是摆脱警告的建议。捕捉没有 then 并没有什么不同。
  • 看错了,抱歉。问题不在于它们在代码上是分开的,而是它们在时间上是分开的。您能否展示一个需要异步附加错误处理程序的真实情况?
  • 这是顺序运行异步操作的错误方式。你应该链接承诺fn().then(op1).then(op2)。那么,你就没有这些问题了。
  • 这里真正的问题是什么?如果您只是尝试按顺序运行多个异步操作(因此一个在下一个开始之前完成),请编辑您的问题以直接说明。
  • 我想知道谁对我投了反对票。唯一的原因可能是我错过了 Estus 的帖子。我的问题显示了研究工作,有用且清晰。埃斯图斯回答了这个问题,他的回答正是我的目标。其他人可能会受益。

标签: node.js promise


【解决方案1】:

被拒绝的承诺应该与catch 链接在同一个滴答上。如果这没有发生,UnhandledPromiseRejectionWarning 就会出现。预计在下一个 Node 版本中会成为例外,因此应该避免。

一旦引入了 Promise 控制流,使用 Promise 就大有裨益。 setTimeout 脱颖而出,不提供对 promise 的错误处理。

如果 Promise 是同时处理的,它们通常使用Promise.all(...).catch(...) 处理。在这种情况下,生成的 promise 与 catch 链接在同一滴答上(this answer 中解决了类似的问题)。

【讨论】:

  • 这是正确的,但我不确定它是否真的解释了 OP 真正尝试做的事情的解决方案,这似乎只是按顺序运行一些异步操作,这可能是更好的方法提供帮助。
  • @jfriend00 我想给出更准确的答案,但是 OP 还没有提供足够的细节,发布的代码看起来更像是“我希望我的承诺同时运行”,尽管我怀疑其背后的逻辑是错误的。
  • @Estus 谢谢你的回答。尤其是下一个节点版本的变化信息,帮助很大。
  • @otembajelle 很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 2016-06-24
  • 2016-08-08
相关资源
最近更新 更多