承诺所有的解决方案

时间:2016-07-12 17:20:54

标签: javascript promise

我正在玩承诺并发现约Promise.all()如果我理解正确,它会在论证中的所有承诺得到解决后解决。我试过很少的代码

var x = ["one", "two"];
var g = 1000;

function take(element, sec) {
  return new Promise(function(res, rej) {
    setTimeout(function() {
      res(element)
    }, sec);
  })
}

Promise.all(x.map(y => {
  take(y, g);
  g+=1000;
})).then(f => {
  alert('done : ' + f);
})

但Promise.all立即解决了,这段代码中是否有任何错误,或者我对它的理解不好?

2 个答案:

答案 0 :(得分:1)

由于torazaburo已经注意到map回调中的return语句丢失了。具有块语法的箭头函数需要显式g+=1000。现在忽略以下作业map。无论如何,依靠全球国家并不是一种好的做法。因此,我将表达式转换为var x = ["one", "two"]; function take(element, sec) { return new Promise(function(res, rej) { setTimeout(function() { res(element) }, sec); }) } Promise.all(x.map((y, i) => take(y, 1000*(i+1)))).then(f => alert('done : ' + f)); 回调并使用不带块语法的箭头:

{{1}}

答案 1 :(得分:0)

正如已经说过多个地方一样,您需要从.map()回调中返回承诺才能使Promise.all()生效。这是一种简单的方法:

Promise.all(x.map(y => {
  var p = take(y, g);
  g+=1000;
  return p;
})).then(f => {
  alert('done : ' + f);
});

在此代码中,f是一系列结果,因此您不清楚在alert()中尝试做什么。