Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么…等待承诺解决,而.forEach()不';T_Javascript_Loops - Fatal编程技术网

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结算)

AFAIK
for…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循环,它也可以正常工作。