gpt4 book ai didi

javascript - 我的 Promise.all() 实现有什么问题?

转载 作者:行者123 更新时间:2023-12-05 02:38:25 26 4
gpt4 key购买 nike

我正在尝试编写我的 Promise.all() 函数。它应该重复原生 Promise.all() 方法的功能。

如果数组中只有 promise,代码可以正常工作,如果数组包含 promise 以外的内容,则可能会出现问题。

这是一个执行示例:

const p1 = Promise.resolve(3);

const p2 = 1337;

const p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 10000, 'foo');
});

promiseAll([p1, p3, p3]).then(values => console.log(values)); // [3, 1337, "foo"]

这是我的代码:

const promiseAll = promises => new Promise((resolve, reject) => {
if (promises.length === 0) { resolve([]); }
const results = [];

let resolved = 0;

promises.forEach(promise => {
if (!(promise instanceof Promise)) {
Promise.resolve(promise).then(data => results.push(data));
}
promise.then(result => {
results.push(result);
resolved += 1;
if (resolved === promises.length) {
resolve(results);
}
}, error => reject(error));
});
});

问题是什么?

最佳答案

您的实现存在两个主要问题:

  1. forEach() 方法中,您有一个检查:promise instanceof Promise。如果此检查为假,您将调用 Promise.resolve() 但随后您还会调用 promise.then(...);您可能打算在 else block 中调用 then() 方法

  2. Promise.all() 维持秩序 - 您的实现不会。这是因为您只是按照 promise 解决的顺序将 promise 结果推送到 results 数组

您可以如下所示更改您的实现以解决上述问题:

const promiseAll = promises => {
return new Promise((resolve, reject) => {
if (promises.length === 0) {
resolve([]);
return;
}

const results = [];
let resolved = 0;

function collectResult(result, index) {
results[index] = result;
resolved += 1;
if (resolved === promises.length) {
resolve(results);
}
}

promises.forEach((value, index) => {
if (
typeof value === 'object' &&
'then' in value &&
typeof value.then === 'function'
) {
value.then(res => collectResult(res, index)).catch(reject);
} else {
Promise.resolve(value).then(res => collectResult(res, index));
}
});
});
};

关于javascript - 我的 Promise.all() 实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69588821/

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