等待函数完成调用另一个 API
Await function to finish calling another API
我是 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();
}
我正在尝试让 call
发生,然后当它完成时 call2
,然后当它完成时 call3
。
有人能指出为什么没有发生这种情况吗?目前,它很快就会击中所有 3 个,并且每个 context.log
都是 undefined
大概是因为端点没有 return 任何东西。每个 url
都是我创建的另一个 azure 函数应用程序 API。
我不需要从每个 call
中 return 使用任何东西,我只是希望它们在继续下一个功能之前完成。
您使用 await
调用的 callUrl
方法本身需要异步或 return Promise。为什么?因为它所做的工作本身就是异步的。
这是您的函数,适用于通过 resolve()
回调使用 Promise 和 return 它的实际值。
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 操作没有正文。这有点不合常规。
我是 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();
}
我正在尝试让 call
发生,然后当它完成时 call2
,然后当它完成时 call3
。
有人能指出为什么没有发生这种情况吗?目前,它很快就会击中所有 3 个,并且每个 context.log
都是 undefined
大概是因为端点没有 return 任何东西。每个 url
都是我创建的另一个 azure 函数应用程序 API。
我不需要从每个 call
中 return 使用任何东西,我只是希望它们在继续下一个功能之前完成。
您使用 await
调用的 callUrl
方法本身需要异步或 return Promise。为什么?因为它所做的工作本身就是异步的。
这是您的函数,适用于通过 resolve()
回调使用 Promise 和 return 它的实际值。
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 操作没有正文。这有点不合常规。