gpt4 book ai didi

Promise.all 的 JavaScript 实现不工作?

转载 作者:行者123 更新时间:2023-11-27 22:52:29 24 4
gpt4 key购买 nike

我正在使用 eloquent javascript 并且必须实现 Promise.all。这是我的解决方案。

function all(promises) {
return new Promise(function(success, fail) {
var results = [];
var failed = false;
promises.forEach(function(promise) {
promise.then(function(result) {
results.push(result);
}, function (error) {
failed = true;
fail(error);
});
});
if (!failed)
success(results);
});
}

这是我正在运行的测试。

// Test code.
all([]).then(function(array) {
console.log("This should be []:", array);
});
function soon(val) {
return new Promise(function(success) {
setTimeout(function() { success(val); },
Math.random() * 500);
});
}
all([soon(1), soon(2), soon(3)]).then(function(array) {
console.log("This should be [1, 2, 3]:", array);
});
function fail() {
return new Promise(function(success, fail) {
fail(new Error("boom"));
});
}
all([soon(1), fail(), soon(3)]).then(function(array) {
console.log("We should not get here");
}, function(error) {
if (error.message != "boom")
console.log("Unexpected failure:", error);
});

我的代码显然是错误的,因为它输出

这应该是[]:[]

这应该是[1,2,3]:[]

我们不应该到这里

其中第一个是唯一正确的。从我的有缺陷的观点来看,实际的解决方案基本上与我写的工作原理相同,可以在这里找到: http://eloquentjavascript.net/code/#17.2

为什么我的代码不起作用?它出什么问题了?

最佳答案

forEach 是同步的,if (!failed) 语句将在 promise 解决之前运行。您可以执行以下操作:

function all(promises) {
var results = [],
left = promises.length;
if (!left) {
return Promise.resolve(results)
}
return new Promise((res, rej) => {
promises.forEach((p, i) => {
Promise.resolve(p).then(x => {
results[i] = x
left -= 1
if (left === 0) {
res(results)
}
}, rej)
})
})
}

使用稀疏数组可以保持顺序,例如:

function timeout(n) {
return new Promise((res) => {
setTimeout(() => {
res(n)
}, n)
})
}

var pa = timeout(200)
var pb = timeout(300)
var pc = timeout(100)

// success
all([pa, pb, pc]).then(console.log).catch(console.log) //=> [200, 300, 100]


// error
var pd = Promise.reject('error')

all([pa, pb, pc, pd]).then(console.log).catch(console.log) //=> error

关于Promise.all 的 JavaScript 实现不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37952336/

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