gpt4 book ai didi

javascript - Nodejs Bluebird Promises - 如何知道是否执行了所有 promise

转载 作者:行者123 更新时间:2023-11-30 12:33:41 26 4
gpt4 key购买 nike

根据 this答案, promise 已经创建,但是方法'then'(也'done')将在不等待子流程输出的情况下执行,我需要一个方法,在完全执行所有子流程后调用,这是怎么回事可以使用bluebird api来完成吗?

示例代码

 var Promise = require('bluebird')
var exec = require('child_process').exec

// Array with input/output pairs
var data = [
['input1', 'output1'],
['input2', 'output2'],
.....
]

var PROGRAM = 'cat'
Promise.some(data.map(function(v) {
var input = v[0]
var output = v[1]

new Promise(function(yell, cry) {
exec('echo "' + input + '" | ' + PROGRAM, function(err, stdout) {
if(err) return cry(err)
yell(stdout)
})
}).then(function(out) {
if(out !== output) throw new Error('Output did not match!')
})
}),data.length)

.then(function() {
// Send succes to user if all input-output pair matched
}).catch(function() {
// Send failure to the user if any one pair failed to match
})

这里的 'then' 函数甚至在子流程完成之前就立即执行。

最佳答案

Promise.some() 期望一个 promise 数组作为它的第一个参数。您正在将 data.map() 的结果传递给它,但是您对 data.map() 的回调从不返回任何内容,因此 .map() 不构造 promise 数组,因此 Promise.some() 没有什么可等待的,所以它立即调用它的 .then() 处理程序。

此外,如果您要等待所有的 promise ,那么您不妨改用 Promise.all()

这就是我想你想要的。

变化:

  1. 切换到 Promise.all() 因为你想等待所有的 promise 。
  2. 返回新的 Promise,以便 .map() 将创建 Promise 数组。
  3. 将输出检查移到原始 promise 中,这样它就可以拒绝而不是抛出,看起来就像是将所有结果检查移到了一个地方。
  4. 添加了所有缺失的分号。
  5. cryyell 更改为 resolvereject 这样代码对于期待正常 promise 的外人来说会更熟悉名字。

代码如下:

var Promise = require('bluebird');
var exec = require('child_process').exec;

// Array with input/output pairs
var data = [
['input1', 'output1'],
['input2', 'output2']
];

var PROGRAM = 'cat';
Promise.all(data.map(function(v) {
var input = v[0];
var output = v[1];

return new Promise(function(resolve, reject) {
exec('echo "' + input + '" | ' + PROGRAM, function(err, stdout) {
if(err) {
reject(err);
} else if (stdout !== output) {
reject(new Error('Output did not match!'));
} else {
resolve(stdout);
}
});
});
})).then(function() {
// Send succes to user if all input-output pair matched
}).catch(function() {
// Send failure to the user if any one pair failed to match
});

关于javascript - Nodejs Bluebird Promises - 如何知道是否执行了所有 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26814680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com