【问题标题】:How can I run several async api functions, then call another function when all are complete?如何运行多个异步 api 函数,然后在全部完成后调用另一个函数?
【发布时间】:2020-03-03 06:45:01
【问题描述】:

我正在使用节点脚本异步进行多个 api 调用,现在我需要在这些调用完成后“做一些事情”。在我执行请求、设置选项并在设置选项后获取doSomething 后,不确定在我的createProject() 函数中做什么。

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() { ... }

【问题讨论】:

  • 使用Promise.all(并使performRequest返回一个承诺)
  • 介意分享我如何使用节点 v10 做到这一点?

标签: javascript node.js asynchronous promise


【解决方案1】:

我们可以使用Promise、await、async 将non-bloking function 转换为blocking function

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() {

}

【讨论】:

  • 我们必须使用async 代替await。
猜你喜欢
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2022-11-17
  • 2014-09-28
相关资源
最近更新 更多