在nodejs中使用promises执行一系列命令
Using promises to execute a series of commands in nodejs
我想在nodejs中使用Q promises通过串行线逐步处理一系列命令。
var cmdArr = ['cmd1', 'cmd2','cmd3'];
我不确定如何构建它。我想过这样的事情,但没有奏效:
Q().then(function() {
cmdArr.forEach(command) {
//here to initialize the promise??
}
});
重要的是保持顺序并且能够在每个步骤之间使用 Q.delay。
假设您要执行的命令是某种异步函数调用:
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!');
});
对数组进行一系列异步操作排序的常见设计模式是使用 .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()
。
我想在nodejs中使用Q promises通过串行线逐步处理一系列命令。
var cmdArr = ['cmd1', 'cmd2','cmd3'];
我不确定如何构建它。我想过这样的事情,但没有奏效:
Q().then(function() {
cmdArr.forEach(command) {
//here to initialize the promise??
}
});
重要的是保持顺序并且能够在每个步骤之间使用 Q.delay。
假设您要执行的命令是某种异步函数调用:
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!');
});
对数组进行一系列异步操作排序的常见设计模式是使用 .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()
。