首页 文章

为什么async-await循环将其结果返回到原始数组?

提问于
浏览
1

我正在使用一个函数 fetchChain 调用一个对象数组,每个对象包含url和其他参数来调用另一个函数 fetchData 来链 fetch Calls . async / await循环将其结果返回给我提供它的数组,如下所示(简化):

fetchChain(array){
    const loop = async (items) => {
        for (let i = 0; i < items.length; i++) {
            await fetchData(items[i])
        }
    }

    return loop(array)
    .then(()=>{ return array })
}

我可以等待所有的承诺/结果返回如下:

fetchChain(prepareAjax)
.then((res)=> console.log(res) )
.then(()=> console.log('done') )

那么为什么循环将其结果返回到它所提供的数组呢?没有特定的返回,或者然后将结果返回到原点,我无法理解这里发生的事情 .

根据要求, fetchDacta -功能:

fetchData(obj){
    // some parameters get added, like so
    obj.timeout = obj.timeout   || 10000, [...];

    const fetchRetry = async (url, options, n) => {
        try {
            return await fetch(url, options)
                .then((response)=> return response.json());
        } catch(err) {
            if (n === 1) throw err;

            return await sleep(obj.delay)
                .then(()=> fetchRetry(url, options, n - 1));
        }
    };

    return fetchRetry(url, {}, obj.retries);
}

1 回答

  • 2

    我'm not sure if I understand the question correctly, but I think you'问为什么函数 fetchChain 中的 array 参数包含 fetchData 中指定的信息 .

    为此你必须看看passing by reference vs passing by value的区别 . 在JavaScript中,对象和数组通过引用自动传递给函数;这意味着 array 指向与 items 相同的内存,当您修改 items 时,您正在修改 array .

    这是一个简单的例子来说明通过引用传递

    let changeMessage = (o) => o.message = 'world';
    let obj = { message: 'hello'};
    changeMessage(obj);
    console.log(obj.message);
    // Output: world
    

    您可以避免首先通过cloning修改数组

相关问题