Jos*_*eto 3 javascript promise
我试图循环完成一个AsynWork数组.并且当时所有的异步工作都无法充斥系统.所以我试图用承诺一个接一个地做.我的问题是我需要通过一个值数组,以便每个异步都适用于数组的每个值.我设法用这个代码做了,但它适用于我的具体情况.不能使它一般.将其重用为其他类型的数组的方法是什么?我已经看到一些解决方案与array.reduce然后承诺,但无法弄清楚.也看过Q但没有使用的例子,如果可以用简单的javascript完成会更好.
我的代码:
function doSomething(ObjIn1, ObjIn2) {
return new Promise(function(resolve, reject) {
console.log("doSomething: ObjIn1: " + ObjIn1 + " ObjIn2: " + ObjIn2);
setTimeout(function() {
console.log("doSomething Done: ObjIn1: " + ObjIn1 + " ObjIn2: " + ObjIn2);
resolve(ObjIn1, ObjIn2);
}, 500);
})
}
function LoopPromises(Function2Loop, functionOptions, Counter, Max) {
console.log("Counter: " + Counter);
if (Counter < Max) {
Function2Loop.apply(this, [functionOptions[0][Counter], functionOptions[1]]).then(function() {
Counter++;
LoopPromises(Function2Loop, functionOptions, Counter, Max);
});
}
}
LoopPromises(doSomething, [
["A1", "A2", "A3"], "ARG2TESTE"
], 0, 3)
Run Code Online (Sandbox Code Playgroud)
你是在思考这个问题:)带参数的函数与没有参数的函数相同,该函数用函数关闭函数,所以:
a(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)
是相同的
(() => a(1,2,3,4))();
Run Code Online (Sandbox Code Playgroud)
除了可能忽略不计的速度之外.我假设你需要为任意数量的承诺排队工作.如果您需要为固定数字执行此操作 - 您可以then在它们之间.让我们看看我们如何做到这一点:
// runs fn on the array elements in sequence, but
function sequence(fns) { // fns - functions returning promises
return fns.reduce((prev, nextFn) => { // 'fold' the array
return prev.then(nextFn); // after the previous is done, execute the next
}, Promise.resolve()); // start with an empty promise
}
Run Code Online (Sandbox Code Playgroud)
确保你先了解减少.为方便起见 - 让我们看一个没有它的例子:
function sequence(fns) { // fns - functions returning promises
var queue = Promise.resolve();
fns.forEach(fn => queue = queue.then(fn));
return queue;
}
Run Code Online (Sandbox Code Playgroud)
我们正在迭代我们的工作数组(函数)并一个接一个地执行它们,在我们执行下一个返回解析的promise之后的下一个.
其中值基于promise解析(via then)等待彼此.这可以让你做到:
sequence([
() => new Promise(r => setTimeout(r, 500));
() => console.log("I only run after the previous work completed");
]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |