JavaScript ES6 - Как объединить методы обещания в Promise.All? - PullRequest
1 голос
/ 30 апреля 2020

У меня есть два метода обещания, первый из которых GetInitialData, который будет выполняться только один раз, также массив Int с 10 идентификаторами, называемый ids, и второй метод GetStudentName, который будет выполняться для каждого идентификатора студента. Теперь я хотел бы объединить все 11 методов (метод 1 + 10 * метод 2) в Promise. Все, как я могу написать код, который будет объединять GetInitialData вместе с 10 экземплярами GetStudentName в массив внутри Promise. Все, что-то вроде ниже?

Promise.All([GetInitialData + IDs.map(Id => GetStudentName(Id)]);

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

вы находитесь на правильном пути:

Promise.all([
  getInitialData,
  // you need to spread this one as it is an array of promises:
  ...ids.map(id => getStudentName(id),
]);

Вот демоверсия:
все асинхронные c функции заменены обещаниями, которые разрешаются в случайное время

const fnPromise = () => new Promise((resolve, reject) =>
    setTimeout(() => resolve(), Math.round(Math.random() * 1000))
);

let i = 0;

async function getInitialData() {
    await fnPromise();
    return i++;
}

async function getStudentName() {
    await fnPromise();
    return i++;
}

const ids = [1, 2, 3, 4, 5, 6];

async function init() {
    $("#console").html('Please wait...');
    
    const allResolved = await Promise.all([
        getInitialData(),
        ...ids.map(() => getStudentName()),
    ]);
    
    // console.log(JSON.stringify(allResolved, null, 2))
    $("#console").html(`[${allResolved.join(', ')}]`)
}

init()
body {
 background: #333;
 color: #fff;
 font-size:2rem;
}

0 голосов
/ 30 апреля 2020
const getOne = async () => 1;
const getTwo = async () => 2;

(async () => {

    const [one, two] = await Promise.all([getOne(), getTwo()]);

    console.log(one);
    console.log(two);
})().then(undefined);

// 1
// 2
...