如何等待module.export函数完成请求,然后再将其返回值分配给不同JS文件中的变量[重复]
Posted
技术标签:
【中文标题】如何等待module.export函数完成请求,然后再将其返回值分配给不同JS文件中的变量[重复]【英文标题】:How to wait for a module.export function to finish request before assigning its return value to a variable in different JS file [duplicate] 【发布时间】:2019-07-20 12:25:11 【问题描述】:我有两个 JS 文件在 Node.js 应用程序中运行。
在 latlng.js 我有这个代码:
async function getPlaceDetails(input)
var locationUrl = 'https://www.google.com';
request(locationUrl, (error, response, body) =>
if (!error && response.statusCode == 200)
let location_json = JSON.parse(body);
let placeDetails =
lat: location_json.candidates[0].geometry.location.lat,
lng: location_json.candidates[0].geometry.location.lng,
name: location_json.candidates[0].name,
return placeDetails;
else
console.log("Error "+response.statusCode);
);
module.exports.getPlaceDetails = getPlaceDetails;
我正在从 latlng.js 导出函数 getPlaceDetails(),以便在 app.js 中使用它,请参见此处:
var place = require('./latlng');
async function firstFunction(input)
let data = await place.getPlaceDetails(input);
return data;
;
async function secondFunction(input)
let data = await firstFunction(input);
// now wait for firstFunction to finish...
console.log(data);
;
secondFunction('museum of modern art');
这对我来说返回未定义。我今天一直在寻找几个小时来获得未定义或 Promise undefined 以外的东西,但没有成功......
【问题讨论】:
" module.exports = getPlaceDetails; " ... 正确导出request
不返回承诺,因此将 getPlaceDetails
变为 async
没有任何帮助。请改用 request-promise 包。
【参考方案1】:
您的getPlaceDetails
函数是基于回调的,当您await
没有回调时,它不会立即返回任何有用的信息。相反,您可以“承诺”它以适应 async/await
模式:
async function getPlaceDetails(input)
return new Promise((resolve, reject) =>
var locationUrl = 'https://www.google.com';
request(locationUrl, (error, response, body) =>
if (!error && response.statusCode == 200)
let location_json = JSON.parse(body);
let placeDetails =
lat: location_json.candidates[0].geometry.location.lat,
lng: location_json.candidates[0].geometry.location.lng,
name: location_json.candidates[0].name,
resolve(placeDetails);
else
console.log("Error "+response.statusCode);
reject(new Error('something meaningful here'));
);
);
module.exports.getPlaceDetails = getPlaceDetails;
【讨论】:
非常感谢@jakemingolla 这个人做到了!然而,我真的不明白“承诺”getPlaceDetails
函数会发生什么。你能详细解释一下会发生什么吗?
查看bluebirdjs.com/docs/api/promise.promisify.html,它有一个相当不错的概述,以及将来应用它的编程方式!
非常感谢!以上是关于如何等待module.export函数完成请求,然后再将其返回值分配给不同JS文件中的变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章