Несколько запросов с axios, не дожидаясь их завершения в списке массивов? - PullRequest
0 голосов
/ 11 ноября 2018
taskList.push(
    const data = {
        url: 'http://${requestUrl}?${argsString}',
        headers: {
            'Content-Type': 'application/octet-stream',
            Authorization: signature //,
            //'Content-Length': buffer.length
        },
        method: 'POST',
        data: buffer
    }
            return axios(data)
        )

try {
        const data = await Promise.all(taskList)
        const res = data.map(d => d.data)
        console.log(res)
        //ctx.state.data = res
    } catch (e) {
        console.log(e)
        throw e
    }

Как не ждать, пока все запросы завершатся, потому что все окончания требуют слишком длительного времени. Если какой-либо запрос закончится, я его распечатаю, он будет очень быстрым для пользователей.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

В случае, если каждый ответ должен быть зарегистрирован, как только он завершен, он должен быть:

const responses = await Promise.all(taskList.map(async task => {
  const { data } = await task;
  console.log(data);
  return data;
}));
0 голосов
/ 11 ноября 2018

Чтобы выполнить каждое обещание, просто добавьте .then() к каждому из них или к Promise.all, однако вы не сможете .map данные после:

try {
    const data = Promise.all(taskList).then(() => console.log('finished'));
    // this will not wait to run, so data will be probably undefined
    const res = data.map(d => d.data)
    ...

Так что я бы предложил следовать шаблону и дождаться их окончания.

Если это занимает слишком много времени, может быть, вам следует попытаться улучшить производительность ответа в серверной части, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...