为什么异步等待循环将其结果返回到原始数组?

时间:2018-12-09 21:37:30

标签: javascript async-await fetch

我正在使用通过对象数组调用的函数fetchChain,每个对象都包含url和其他参数,以调用另一个函数fetchData来链接fetch-调用。 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 个答案:

答案 0 :(得分:2)

我不确定我是否正确理解了这个问题,但是我想您是在问为什么函数array中的fetchChain自变量包含在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修改数组