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

Node.js 等待函数完成调用另一个API,node.js,async-await,request,azure-function-app,Node.js,Async Await,Request,Azure Function App,我不熟悉使用async/await,但有几个问题 我有下面的代码,它似乎没有等到上一个函数完成 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)

我不熟悉使用async/await,但有几个问题

我有下面的代码,它似乎没有等到上一个函数完成

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();
}
我试图让
调用
发生,然后当调用完成时
调用2
,然后当调用完成时
调用3

有人能指出为什么没有发生这种情况吗?目前,它几乎尽快命中所有3个,并且每个
context.log
都是
未定义的
,可能是因为端点没有返回任何内容。每个
url
都是我创建的另一个azure函数应用程序API


我不需要从每次调用中返回任何要使用的内容,我只是希望它们在继续下一个函数之前完成。

您使用
wait
调用的
callUrl
方法本身需要是异步的,或者返回一个承诺。为什么?因为它所做的工作本身是异步的

下面是您的函数,它适合使用承诺并通过
resolve()
回调返回其实际值

function callUrl (context, web) {
  var requestUrl = url.parse(web);
  const requestOptions = {
    hostname: requestUrl.hostname,
    path: requestUrl.path,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    }
  };
  return new Promise(function (resolve,reject) {
    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 );
        resolve( jsonData );
      } );
    } )
    .on( 'error', function( error ) {
      reject(error);
    } );
    request.end();
  });
}

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

您的
callUrl
方法(使用
await
调用)本身需要异步或返回承诺。为什么?因为它所做的工作本身是异步的

下面是您的函数,它适合使用承诺并通过
resolve()
回调返回其实际值

function callUrl (context, web) {
  var requestUrl = url.parse(web);
  const requestOptions = {
    hostname: requestUrl.hostname,
    path: requestUrl.path,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    }
  };
  return new Promise(function (resolve,reject) {
    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 );
        resolve( jsonData );
      } );
    } )
    .on( 'error', function( error ) {
      reject(error);
    } );
    request.end();
  });
}

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

啊,n00b行为。谢谢你建议做什么来代替没有正文的帖子?我只需要打电话,我不需要发送任何东西。另外,如果不返回承诺,异步解决方案是什么?要么将承诺放在其中,要么使用一个库为您连接状态机,如
axios
。这样,它会返回一个承诺,所以你可以等待它。如果你调用的服务支持它,你可以使用GET。没有身体的帖子没什么问题,只是有点奇怪。如果您保留bodyless POST,您可能会在其中添加一条关于它的注释,以便下一个处理代码的人理解。npm有名为
请求承诺
节点获取
的包,这两个包都可以让您无需自己编写承诺内容就可以访问web服务。但是,为什么<代码>等待和
承诺。下一步()
使用完全相同的机制。啊,n00b行为。谢谢你建议做什么来代替没有正文的帖子?我只需要打电话,我不需要发送任何东西。另外,如果不返回承诺,异步解决方案是什么?要么将承诺放在其中,要么使用一个库为您连接状态机,如
axios
。这样,它会返回一个承诺,所以你可以等待它。如果你调用的服务支持它,你可以使用GET。没有身体的帖子没什么问题,只是有点奇怪。如果您保留bodyless POST,您可能会在其中添加一条关于它的注释,以便下一个处理代码的人理解。npm有名为
请求承诺
节点获取
的包,这两个包都可以让您无需自己编写承诺内容就可以访问web服务。但是,为什么
wait
Promise.next()
使用完全相同的机制。为什么你要发帖子,却不发送任何数据?而且,当没有要发送的内容时,为什么要设置
内容类型
?如果您只是在检索内容,这似乎是一个GET。我建议使用一个预构建的库来完成
callUrl()
函数所做的一切,包括为您自动解析JSON响应。我最喜欢的是
got()
,但是还有node-fetch、superagent和axios都很流行。这是一个常规的编程需求,许多经过良好测试的库都是为您构建的。为什么您要写一篇文章,但不发送任何数据?而且,当没有要发送的内容时,为什么要设置
内容类型
?如果您只是在检索内容,这似乎是一个GET。我建议使用一个预构建的库来完成
callUrl()
函数所做的一切,包括为您自动解析JSON响应。我最喜欢的是
got()
,但是还有node-fetch、superagent和axios都很流行。这是一个常规的编程需求,许多经过良好测试的库都是为您构建的。