Выполнять несколько обещаний параллельно, но получать результат только от одного из них - PullRequest
2 голосов
/ 16 июня 2020

Сейчас у меня есть программа, в которой я хочу вызвать несколько REST API: параллельно, но меня интересует только результат одного из них.

В настоящее время я решил это следующим образом:

private async loadData () {
    const all = [this.loadFirstData(), this.loadSecondData(), this.loadThirdData()];
    const combine = Promise.all(all);
    await combine;

    // One of the promises just puts it's return value in this global variable, so that I can access it after it is done.
    if (this.valueFromThirdAPI) {
        // Do something with value
    }
}

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

Promises.all возвращает массив разрешенных значений, но как отличить guish их от каждого другой, если меня интересует только ценность одного из них? Двум другим не нужно ничего возвращать.

Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 16 июня 2020

Во-первых, имеет смысл ждать Promise.all,

Вы можете получить доступ к результату, используя индекс возвращенного массива. Другой вариант - использование деструктора массива.

Ниже приведен пример ..

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve('this one');
const promise4 = Promise.resolve(4);

async function test() {
  //note the double `,` to ignore the first 2 promises.
  const [,,three] = await Promise.all([promise1, promise2, promise3, promise4]);
  console.log(three);
}

test();
1 голос
/ 16 июня 2020

Ждите третьего, а затем ждите всех. Так что, если третье завершается раньше первого и второго, вы можете обработать его раньше.

private async loadData () {
    const all = [this.loadFirstData(), this.loadSecondData(), this.loadThirdData()];
    const third = await all[2];
    if (third) {
        // Do something with value
    }

    await Promise.all(all);
}
1 голос
/ 16 июня 2020

Вы можете перебирать возвращаемые значения, когда все они разрешены. Promise.all (). Then (values) Взгляните на https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

1 голос
/ 16 июня 2020

Promise.all возвращает массив с тем же порядком, что и данные обещания:

private async loadData () {
    const all = [this.loadFirstData(), this.loadSecondData(), this.loadThirdData()];
    const combine = Promise.all(all);
    const values = await combine;

    // One of the promises just puts it's return value in this global variable, so that I can access it after it is done.
    if (values[2]) {
        // Do something with value
    }
}
...