gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 16:36:59 25 4
gpt4 key购买 nike

我的问题与this 非常相似, 但我无法让它工作:(

问题:

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

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

  3. 每个函数都会返回一个 Promise。 Promise.all(promisesArray)工作到我可以“等待”直到所有功能完成后再继续的程度。但它不保证每个函数都按顺序运行。这是必不可少的。

  4. 我试过使用 Array.prototype.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]

最佳答案

你真的很了解你的 reducer !

reducer 的初始值是 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 进行比较。您将返回下一个要等待的 promise :

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"); })

看到reducer怎么这么近了吗?我们只想返回一个 promise :

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();
});

编辑:
如果 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();
});

关于javascript - 如何序列化返回 Promises 的函数的 Javascript 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50263209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com