Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 承诺:异步处理可以吗?_Node.js_Promise - Fatal编程技术网

Node.js 承诺:异步处理可以吗?

Node.js 承诺:异步处理可以吗?,node.js,promise,Node.js,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 = fun

我的问题是:从承诺对象中分离处理是否安全

如果我这样做

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


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

拒绝的承诺应在同一勾上用
catch
链接。如果未发生此情况,则会显示未处理的PromisejectionWarning。在下一个节点版本中,它将成为一个例外,因此应该避免

一旦引入了承诺控制流,使用承诺是有益的
setTimeout
非常突出,不提供承诺的错误处理


如果承诺是并发处理的,则通常使用
Promise.all(…).catch(…)
处理它们。在这种情况下,产生的承诺在相同的勾号上与
catch
链接(中解决了类似的问题)。

被拒绝的承诺应在相同的勾号上与
catch
链接。如果未发生此情况,则会显示未处理的PromisejectionWarning。在下一个节点版本中,它将成为一个例外,因此应该避免

一旦引入了承诺控制流,使用承诺是有益的
setTimeout
非常突出,不提供承诺的错误处理



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

Hi Amadan,我认为您的评论是一个建议,以消除警告。如果没有“then”这个词的话,抓住它也没什么区别。误读了,对不起。问题不在于它们在代码中是分开的,而是它们在时间上是分开的。您能否展示一个需要异步附加错误处理程序的实际情况?这是顺序运行异步操作的错误方法。您应该将承诺链接到
fn()。然后(op1)。然后(op2)
。那么,你没有这些问题。这里真正的问题是什么?如果您只是想按顺序运行几个异步操作(这样一个操作在下一个操作开始之前完成),请编辑您的问题,这样说吧。我想知道是谁否决了我。唯一的原因可能是我错过了Estus post。我的问题表明了研究的努力,是有用的和明确的。以斯都回答了,他的回答正是我想要的。其他人可能会受益。嗨,阿玛丹,我想你的评论是一个建议,以摆脱警告。如果没有“then”这个词的话,抓住它也没什么区别。误读了,对不起。问题不在于它们在代码中是分开的,而是它们在时间上是分开的。您能否展示一个需要异步附加错误处理程序的实际情况?这是顺序运行异步操作的错误方法。您应该将承诺链接到
fn()。然后(op1)。然后(op2)
。那么,你没有这些问题。这里真正的问题是什么?如果您只是想按顺序运行几个异步操作(这样一个操作在下一个操作开始之前完成),请编辑您的问题,这样说吧。我想知道是谁否决了我。唯一的原因可能是我错过了Estus post。我的问题表明了研究的努力,是有用的和明确的。以斯都回答了,他的回答正是我想要的。其他人可能会从中受益。这是正确的,但我不确定它是否真的解释了OP真正想做的事情的解决方案,似乎只是按顺序运行一些异步操作,这可能是更好的帮助方式。@jfriend00我想给出更准确的答案,但OP还没有提供足够的细节,发布的代码看起来更像是“我希望我的承诺同时运行”,尽管我怀疑它背后的逻辑是错误的。@Estus谢谢你的回答。特别是关于下一个节点版本中的更改的信息是一个很大的帮助。@otembajelle很高兴它有帮助。这是正确的,但我不确定它是否真的解释了OP真正想做的事情的解决方案,似乎只是按顺序运行一些异步操作,这可能是更好的帮助方式。@jfriend00我想给出更准确的答案,但OP还没有提供足够的细节,发布的代码看起来更像是“我希望我的承诺同时运行”,尽管我怀疑它背后的逻辑是错误的。@Estus谢谢你的回答。特别是关于下一个节点版本中的更改的信息是一个很大的帮助。@otembajelle很高兴它有帮助。