Почему цикл async-await возвращает свой результат в исходный массив? - PullRequest
0 голосов
/ 10 декабря 2018

Я использую функцию 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 Ответ

0 голосов
/ 10 декабря 2018

Я не уверен, правильно ли я понимаю вопрос, но мне кажется, вы спрашиваете, почему аргумент array в функции fetchChain содержит информацию, назначенную в fetchData.

.нужно посмотреть на разницу , передаваемую по ссылке, по сравнению с передачей по значению .В JavaScript объекты и массивы автоматически передаются по ссылке на функцию;это означает, что array указывает на ту же память, что и items, и когда вы изменяете items, вы изменяете array.

Это простой пример, иллюстрирующий передачу по ссылке

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

Вы можете избежать изменения массива путем клонирования сначала

...