如何等待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文件中的变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

export 和 module.export 的区别

如何在从 Swift 3 中的函数返回结果之前等待 URLSession 完成

如何等待异步函数执行?

import、module、export的作用

fetch() 完成后如何调用函数

在映射下一项之前,异步等待映射不等待异步函数在映射函数内部完成