等待函数完成调用另一个API

时间:2020-02-17 18:43:37

标签: node.js async-await request azure-function-app

我是刚开始使用异步/等待并遇到一些问题的人。

我有下面的代码,似乎不等到上一个功能完成?

var url = require('url');
var path = require('path');
var https = require('https');
var request = require('request');
var url1 = 
var url2 = 
var url3 =


module.exports = async function (context, req) {
    var call = await callUrl(context, url1);
    context.log(call);
    var call2 = await callUrl(context, url2);
    context.log(call2);
    var call3 = await callUrl(context, url3);
    context.log(call3);
};

function callUrl (context, web) {
    var requestUrl = url.parse(web);
    const requestOptions = {
        hostname: requestUrl.hostname,
        path: requestUrl.path,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        }
    };
    var request = https.request(requestOptions, function(res) {
        var data = "";
        res.on('data', function (chunk) {
            data += chunk;
        });
        res.on('end', function () {
            var jsonData = JSON.parse(data);
            return jsonData;
        });        
    }).on('error', function(error) {
        context.log("request error:", error);
        return context.done();
    });
    request.end();
}

我正在尝试让call发生,然后call2完成,然后call3完成。

有人可以指出为什么这种情况不会发生吗?当前,它几乎全部命中了所有3个,并且每个context.logundefined大概是因为端点不返回任何东西。每个url都是我创建的另一个Azure函数app API。

我不需要从每个call中返回使用任何东西,我只是希望它们在继续执行下一个功能之前完成。

1 个答案:

答案 0 :(得分:2)

您用coroutineJob调用的callUrl方法需要本身异步或返回Promise。为什么?因为它所做的工作本身是异步的。

这里,您的函数适用于使用Promise并通过await回调返回其实际值。

resolve()

请注意,您没有主体使用POST操作。这有点不合常规。