你如何同步解决一系列es6承诺? [英] How do you synchronously resolve a chain of es6 promises?

查看:119
本文介绍了你如何同步解决一系列es6承诺?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个返回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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆