如何序列化返回 Promises 的 Javascript 函数数组?

2024-04-13

我的问题非常类似于this https://stackoverflow.com/questions/42204008/serial-execution-of-functions-returning-promises,但我无法让它工作:(

PROBLEM:

  1. 我有一个 Javascript 程序需要在 IE11 和 Chrome 中运行。

  2. 它有一个我需要按顺序执行的函数列表。

  3. 每个函数都会返回一个 Promise。Promise.all(promisesArray) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all工作到我可以“等待”直到所有功能完成后再继续。但它不能保证每个函数都按顺序运行。这是至关重要的。

  4. 我尝试过使用Array.prototype.reduce() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce,但我一直无法弄清楚如何正确使用它。

  5. 因为我需要在IE11中运行,所以我无法使用像“箭头函数”这样的ES6功能。

这是我的代码:

<script>
var fn = function(arg) {
  return new Promise (function (resolve, reject) {
    console.log("fn(" + arg + ")...");
    resolve("OK");
  });
}

var p = fn("A").then(function(r) {
  console.log("promise resolved: " + r + ".");
})

var chain = [];
chain.push(fn("3"));
chain.push(fn("1"));
chain.push(fn("2"));
console.log("Built chain:", chain);
Promise.all(chain);

chain.length = 0;
chain[2] = fn("30");
chain[1] = fn("20");
chain[0] = fn("10");
chain.reduce(function(promise, item) {
  return promise.then(function() {
    console.log("then:", item);
  }), Promise.resolve();
});
console.log("Done.");
</script>;

我需要按顺序执行的功能array[0], array[1], array[2].


你的减速机真的很接近!

减速器的初始值为Promise.resolve(),所以当第一次调用该函数时:

chain.reduce(function(promise, item) {
//                    ^^ promise is a resolved promise,
//                             ^^ item is chain[0]
  return promise.then(function() {
    console.log("then:", item);
    //           ^^ when the promise resolves (immediately) this is called
    //              BUT no value is returned.
  }), Promise.resolve();

});

将此与手动链接承诺进行比较。您将返回下一个要等待的承诺:

Promise.resolve()
  .then(item => { console.log("then: ", item); return fn("10"); })
  .then(item => { console.log("then: ", item); return fn("20"); })
  .then(item => { console.log("then: ", item); return fn("30"); })

看看减速机怎么这么近?我们只想返回一个承诺:

var chain = [fn("10"), fn("20"), fn("30")];

chain.reduce(function(promise, item) {
  return promise.then(function() {
    console.log("then:", item);
    return item;
  }), Promise.resolve();
});

Edit:
If the fn调用开始工作,每个分配都会无序地启动调用:

chain.length = 0;
chain[2] = fn("30");
chain[1] = fn("20");
chain[0] = fn("10");

运行每个fn按照您想要的顺序,您必须将呼叫推迟到fn直到上一个呼叫解决。我们在上面的手动示例中做到了这一点。根据数据的复杂程度,您可以减少参数数组fn或将每个调用包装在一个不会运行的函数中:

[10,20,30]
  .reduce(function(promise, arg) {
    return promise.then(function() {
      return fn(arg);
    }), Promise.resolve();
  });

[function() { return fn(10); }, function() { return fn(20) }, function() { return fn(30) }]
  .reduce(function(promise, callFn) {
    return promise.then(function() {
      return fn(callFn);
    }), Promise.resolve();
  });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何序列化返回 Promises 的 Javascript 函数数组? 的相关文章

随机推荐