我有一个函数数组,我想按顺序执行,其中一些函数返回一个promise,而其他函数只返回一个值。
我希望一次执行一个函数,以便它们出现在数组中。如果函数返回一个promise,我想等到它解析为一个值。如果它返回一个值,我希望它只是使用该值。
我希望它如何工作的示例:
array=($(dbus-send --system --print-reply ... 2>&1 ))
如果任何承诺失败,链函数应该停止执行并进一步传递错误。
答案 0 :(得分:4)
您当前的解决方案相当矫枉过正,承诺已接受.then
的值和/或承诺,您可以将代码重构为:
var queue = Promise.resolve(); // start empty queue
var results = arr.map(function(el){
return (queue = queue.then(function(){ // update the queue to wait for next promise
return el(); // call the function, return it so the array resolves to it
}));
});
Promise.all(results).then(function(results){
// access all results here
});
答案 1 :(得分:0)
在提出问题时想出来并决定分享。
function f1() {
return 1;
}
function f2() {
return new Promise(function (resolve, reject) {
// ...
resolve(4);
}).then(function (num) {return num / 2; });
}
function f3() {
return Promise.resolve("3");
}
var array = [f1, f2, f3];
chain(array).then(function (values) {
// values == [1, 2, "3"];
});
用法:
function chain(array) {
array = array.slice(); // Make a copy
var result = [];
return new Promise(function (resolve, reject) {
(function chainLoop() { // Make an IIFE-based loop
if (array.length > 0) { // If we have elements in the array...
Promise.resolve(array.shift()()) // Remove and resolve value of first element from the array
.then(function (value) {
result.push(value); // Push onto the result
chainLoop(); // Loop - This won't cause a stack overflow, promises reset the stack
}, reject);
} else { // Otherwise, if the array is empty...
resolve(result); // resolve with our result array.
}
}());
});
}
如果阵列中存在非功能,这将会崩溃,因此还有改进的余地,但这符合我目前的需求。