Javascript 为什么…等待承诺解决,而.forEach()不';T
我很难理解在处理承诺时,的Javascript 为什么…等待承诺解决,而.forEach()不';T,javascript,loops,Javascript,Loops,我很难理解在处理承诺时,的与.forEach()有何不同 使用此代码段: const allSettled = async arr => { const data = [] for (const promise of arr) { try { const result = await promise; data.push(result); } catch (e) { d
与.forEach()
有何不同
使用此代码段:
const allSettled = async arr => {
const data = []
for (const promise of arr) {
try {
const result = await promise;
data.push(result);
} catch (e) {
data.push(e)
}
}
return data
}
const badAllSettled = arr => {
const data = []
arr.forEach(async promise => {
try {
const result = await promise;
data.push(result);
} catch (e) {
data.push(e)
}
})
return data
}
我检查数组中的每个承诺,等待它解决,并将结果推送到数据中。它按顺序执行
如果我有这个片段:
const allSettled = async arr => {
const data = []
for (const promise of arr) {
try {
const result = await promise;
data.push(result);
} catch (e) {
data.push(e)
}
}
return data
}
const badAllSettled = arr => {
const data = []
arr.forEach(async promise => {
try {
const result = await promise;
data.push(result);
} catch (e) {
data.push(e)
}
})
return data
}
我得到一个空数组(因为forEach
不等待Promise结算)
AFAIKfor…of
与iterables一起工作,因此它可能会暂停并等待等待
返回。但我不明白这个流程是如何一步一步地工作的
谢谢 for…of
不会等待。wait
关键字执行等待操作。这里有一个例子:const result=wait promise代码>
forEach
的内部不会等待传递给forEach(此处)
的函数返回的承诺。(在生成承诺的函数中使用wait
是不相关的)。.forEach()
的实现方式如下:
Array.prototype.forEach=函数forEach(fn){
for(设i=0;i
如您所见,当调用.forEach()
时,它只会同步调用回调多次。但是,如果回调是异步函数,则不会等待它
相反,当在异步函数中找到wait
关键字时,该函数的所有代码执行都会暂停,直到承诺解决为止,这意味着任何控制流(包括for…of
循环)也会暂停
以下代码的行为类似于.forEach()
,因为它调用了异步函数,该函数等待承诺,而不等待函数返回的承诺:
const allselled=async arr=>{
常量数据=[]
对于(arr的持续承诺){
(异步()=>{
试一试{
const result=等待承诺;
数据推送(结果);
}捕获(e){
数据推送(e)
}
)();
}
返回数据
}
用于(数组的常量项){
//做点什么
}
对数组的每个元素执行“something”。如果您等待数组中的某个元素,它将等待它,直到继续执行代码的其余部分
array.forEach(回调)
同步调用数组中每个元素的回调。如果回调恰好是异步的,它将调用它,然后立即调用下一个回调。。forEach在调用下一个回调之前不会等待每个回调解析为某个内容
请注意,如果您希望您的承诺并行运行,也许为了获得性能收益,您可能需要使用
//按顺序运行每次提取
//如果每个都需要1秒,则需要3秒才能完成
常量结果=[]
(第[1,2,3]项的常数){
结果.推送(等待获取某物(项目))
}
//在Parralel中运行每个fetch
//如果每一个都需要1s,则完成此操作需要1s
const promises=[1,2,3].map(item=>fetchSomething(item))
const results=等待承诺。全部(承诺)
.forEach()
不理解承诺。
的…的是控制流,受等待
的影响(就像其他循环一样,if语句等).forEach
只是一个方法调用,wait
只会使async
函数等待,而不是badallselled
。感谢您的解释!承诺。所有操作都不允许拒绝,因此我使用了这种“有点”allselled polyfill。此外,我尝试了常规for循环,它也可以正常工作。