使用promise在nodejs中执行一系列命令

我想通过使用Q promise在nodejs中通过串行线路逐步处理一系列命令。

var cmdArr = ['cmd1', 'cmd2','cmd3']; 

我不知道如何build立这个。 我想过这样的事情,但没有奏效:

 Q().then(function() { cmdArr.forEach(command) { //here to initialize the promise?? } }); 

重要的是保持序列,并能够在每个步骤之间使用Q.delay。

假设你想要执行的命令是某种asynchronous函数调用:

 var Q = require('q'); // This is the function you want to perform. For example purposes, all this // does is use `setTimeout` to fake an async operation that takes some time. function asyncOperation(input, cb) { setTimeout(function() { cb(); }, 250); }; function performCommand(command) { console.log('performing command', command); // Here the async function is called with an argument (`command`), // and once it's done, an extra delay is added (this could be optional // depending on the command that is executed). return Q.nfcall(asyncOperation, command).delay(1000); } // Set up a sequential promise chain, where a command is executed // only when the previous has finished. var chain = Q(); [ 'cmd1', 'cmd2', 'cmd3' ].forEach(function(step) { chain = chain.then(performCommand.bind(null, step)); }); // At this point, all commands have been executed. chain.then(function() { console.log('all done!'); }); 

我对q不太熟悉,所以可能会做得更好。

为了完整,这里是一个使用bluebird的版本:

 var Promise = require('bluebird'); ... var asyncOperationAsPromised = Promise.promisify(asyncOperation); function performCommand(command) { console.log('performing command', command); return asyncOperationAsPromised(command).delay(1000); } Promise.each( [ 'cmd1', 'cmd2', 'cmd3' ], performCommand.bind(null) ).then(function() { console.log('all done!'); }); 

对数组进行一系列asynchronous操作的常见devise模式是使用.reduce()如下所示:

 var cmdArr = ['cmd1', 'cmd2','cmd3']; cmdArr.reduce(function(p, item) { return p.delay(1000).then(function() { // code to process item here // if this code is asynchronous, it should return a promise here return someAyncOperation(item); }); }, Q()).then(function(finalResult) { // all items done here }); 

请注意,我还显示了您可以根据要求插入Q的.delay()