我正在使用通过对象数组调用的函数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);
}
答案 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修改数组