Nodejs蓝鸟承诺 – 如何知道是否所有的承诺都被执行

根据这个答案,promise已经被创build,但是方法'then'(也是'done')将被执行而不需要等待subprocess的输出,我需要一个方法在被完全执行完所有的subprocess之后被调用,如何使用蓝鸟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'函数甚至在subprocess完成之前立即执行。

Promise.some()需要一个promise数组作为它的第一个参数。 您将data.map()的结果传递给它,但是您对data.map()callback永远不会返回任何内容,因此.map()不会构造一个Promise.some()数组,因此Promise.some()等待,所以它立即调用它的.then()处理程序。

另外,如果你要等待所有的承诺,那么你可以使用Promise.all()来代替。

这是我想你想要的。

变化:

  1. 切换到Promise.all()因为你想等待所有的承诺。
  2. 返回新的Promise, .map()将创build承诺数组。
  3. 将输出检查移动到原来的承诺,以便它可以拒绝而不是抛出,它似乎将所有的结果检查移动到一个地方。
  4. 添加了所有缺less的分号。
  5. 改变了yell resolvereject所以代码将更加熟悉外界期待正常承诺的名称。

代码如下:

 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 });