你如何同步解决一系列es6承诺? [英] How do you synchronously resolve a chain of es6 promises?
问题描述
我有一个返回promise的库中的函数。我需要多次运行此函数,但每次迭代必须等到上一个任务完成。
我的假设是我可以这样做:
promiseReturner(1)
.then(promiseReturner(2)
.then(promiseReturner(3)
。然后(...)
可以使用循环简化:
var p = Promise.resolve();
for(var i = 1; i< = 10; i ++){
p = p.then(promiseReturner(i));
}
但是,当我这样做时链中的每个承诺都是在同一时间执行,而不是一个接一个地执行,因为 .then()
似乎意味着。显然,我错过了一些关于承诺的基本信息 - - 但在阅读了几篇教程和博客文章后,我仍然迷失了。
您的非循环解决方案也不应该起作用。您必须将函数传递给 .then
,而不是承诺:
var p = Promise.resolve();
for(var i = 1; i< = 10; i ++){
(function(i){
p = p.then(function(){
return promiseReturner(i) );
});
}(i));
}
如果该函数返回一个promise,那么你就会获得链接效果。
关于承诺的更多信息 MDN 。
可以用简化
(和箭头功能):
var p = Promise.resolve();
for(let i = 1; i< = 10; i ++){
p = p.then(()=> promiseReturner(i));
}
或 键 .bind
(即ES5):
var p = Promise.resolve( );
for(var i = 1; i< = 10; i ++){
p = p.then(promiseReturner.bind(null,i));
}
I have a function from a library that returns a promise. I need to run this function multiple times, but each iteration must wait until the previous task is done.
My assumption was that I could do this:
promiseReturner(1)
.then(promiseReturner(2)
.then(promiseReturner(3)
.then(...)
Which could be simplified using a loop:
var p = Promise.resolve();
for (var i=1; i<=10; i++) {
p = p.then(promiseReturner(i));
}
However, when I do this each promise in the chain is executed at the same time, instead of one after the other as .then()
seems to imply. Clearly I'm missing something fundamental about promises -- but after reading several tutorials and blog posts I'm still lost.
Here's a codepen I wrote up to demonstrate my attempt.
Your "non-loop" solution shouldn't work either. You have to pass a function to .then
, not a promise:
var p = Promise.resolve();
for (var i=1; i<=10; i++) {
(function(i) {
p = p.then(function() {
return promiseReturner(i);
});
}(i));
}
If that function returns a promise, then you get that chaining effect.
More info about promises on MDN.
Can be simplified with let
(and arrow functions):
var p = Promise.resolve();
for (let i=1; i<=10; i++) {
p = p.then(() => promiseReturner(i));
}
Or .bind
(which is ES5):
var p = Promise.resolve();
for (var i=1; i<=10; i++) {
p = p.then(promiseReturner.bind(null, i));
}
这篇关于你如何同步解决一系列es6承诺?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!