Как я могу запустить несколько асинхронных API-функций, а затем вызвать другую функцию, когда все будет завершено? - PullRequest
0 голосов
/ 06 ноября 2019

Я использую скрипт узла, чтобы сделать несколько вызовов API асинхронно, и теперь мне нужно «сделать что-то», как только эти вызовы будут выполнены. Не уверен, что делать в моей функции createProject() после того, как я выполню запрос, установлю параметры и получу doSomething ПОСЛЕ настройки.

function performRequest(reqOptions, reqBody, success) {
  const req = https.request(reqOptions, (res) => {
    var chunks= [];

    // data received
    res.on('data', function (chunk) {...});

    // data processed
    res.on('end', function() { success(Buffer.concat(chunks).toString()); });
  });

  // error occurred during request
  req.on('error', (e) => {
    console.error('Request error: ' + e);
  });

  req.write(JSON.stringify(reqBody));

  // end request
  req.end();
}

function createProject(name) {  
  var reqOptions = {...};
  var reqBody = {...};

  performRequest(reqOptions , reqBody , function(data) {
    // project successfully created - set project options
    setOption1(data.id);
    setOption2(data.id);

    // after options set, do something
    doSomething();

  });
}

function setOption1(id) {
  // performRequest(...)
}

function setOption2(id) {
  // performRequest(...)
}

function doSomething() { ... }

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Мы можем сделать non-bloking function до blocking function, используя Promise, await, async

function performRequest(reqOptions, reqBody, success) {
    return new Promise((resolve, reject) => {
        const req = https.request(reqOptions, (res) => {
            var chunks = [];

            // data received
            res.on('data', function (chunk) { });

            // data processed
            res.on('end', function () {
                resolve(Buffer.concat(chunks).toString());
            });
        })

        // error occurred during request
        req.on('error', (e) => {
            console.error('Request error: ' + e);
            reject(e);
        });

        req.write(JSON.stringify(reqBody));

        // end request
        req.end();
    });
}

async function createProject(name) {
    var reqOptions = { ...  };
    var reqBody = { ... };

    var data = await performRequest(reqOptions, reqBody);
    // project successfully created - set project options
    await setOption1(data.id);
    await setOption2(data.id);

    // after options set, do something
    doSomething();

}

async function setOption1(id) {
    return performRequest(...)
}

async function setOption2(id) {
    return performRequest(...)
}

function doSomething() {

}
0 голосов
/ 06 ноября 2019

Вы можете использовать JavaScript Promise.all () , который будет возвращать одно Обещание, которое разрешается при разрешении обещаний как setOption1, так и setOption2.

await Promise.all([setOption1(data.id), setOption2(data.id))
doSomething();

или

Promise.all([setOption1(data.id), setOption2(data.id)).then(() => {
  doSomething();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...