问题描述
我正在开发一个 node.js 应用程序并使用 Request 从 API 获取数据,使用此函数:
function do_request( method,path,body ){
var options = {
...
};
request( options,function(err,response,body){
if (err) console.log(err);
return JSON.parse(response.body);
});
}
我希望能够将返回值保存到一个变量 - 像这样:
var products = do_request('GET','/products','');
目前,如果我在上面的代码之后 console.log(products)
,我得到 undefined
。
根据我从谷歌搜索中发现的信息,它看起来可能与异步相关。我已经尝试根据我发现的一些示例/解决方案使用承诺和异步函数,但我是一个节点菜鸟,无法让它工作。有什么想法吗?
解决方法
尝试promisify request
库并在 do_request
函数中调用 async
(因为您可以在 await
函数中 async
}} 函数)
function do_request( method,path,body ){
var options = {
...
};
return new Promise((resolve,reject)=>{
request( options,function(err,response,body){
if (err) reject(err);
resolve(JSON.parse(response.body));
});
})
}
async function main_code(){
try{
var products = await do_request('GET','/products','');
}
catch(e){
// exception handling
}
finally{
// stuff to do anyway,cleanups etc etc.
}
}
main_code();
,
异步版本看起来像这样:
async function do_request( method,body ){
var options = {
...
};
await request( options,body){
if (err) console.log(err);
return JSON.parse(response.body);
});
}
或者由于 Request 已被弃用,您可以/(应该?)使用类似 axios 的东西:
axios.get("request_url").then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
,
您必须通过添加 async
关键字使您的函数成为异步函数,并且您可以使用 await
关键字调用您的函数。
然后当请求完成且没有错误时。您可以看到您的产品变量具有一些有意义的值。
如果您只是在函数调用行之后打印产品变量。它将是未定义的,因为到那时请求尚未完成。
您可以选择的是使用 .then
(回调)而不是 await 关键字。因此,当您的请求返回时,您的产品变量将被填充,然后您可以打印它。像这样:
do_request('GET','').then((returning_value)=>{console.log(returning_value})