Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用node.js中promise函数的返回值_Javascript_Node.js - Fatal编程技术网

Javascript 如何使用node.js中promise函数的返回值

Javascript 如何使用node.js中promise函数的返回值,javascript,node.js,Javascript,Node.js,我想写一个函数,从node.js中的GooglePlacesAPI返回数据。该功能的定义如下所示: function getAddress(placeName) { return new Promise((resolve, reject) => { return axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').the

我想写一个函数,从node.js中的GooglePlacesAPI返回数据。该功能的定义如下所示:

function getAddress(placeName) {
  return new Promise((resolve, reject) => {
    return axios.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + placeName + '&key=MyAPIKey').then(response => {
      const placeID = response.data.results[0].place_id
       return axios.get('https://maps.googleapis.com/maps/api/place/details/json?placeid=' + placeID + '&key=MyAPIKey').then(response => {
          resolve(response.data.result)
          return response.data.result // here i would like to return the data.result
        }).catch(err => {
          console.error(err);
        });
    }).catch(err => {
      reject(err);
    });
  });
}
我想使用这个函数并得到一个返回值。我已尝试使用下面的代码,但出现错误“Promise pending”

const address = getAddress('someName').then(address => {
    phone: address.formatted_phone_number
  }).catch(err => {
    console.error(err)
  })

那么,如何构造函数,使其返回数据呢?

您正在返回axios的结果。在您解决承诺之前,获取,因此它永远不会解决问题。您应该只返回
resolve/reject
,否则您的承诺将永远无法解决(除非在返回之前调用了
resolve/reject


承诺是一个异步概念,函数中的
return
语句是同步的。在您的示例中,
newpromise(…)
分支出同步执行流,因此在Promise中生成的任何结果都不能以同步方式访问

您的函数返回一个承诺,并且在其中处理异步结果的唯一方法是使用其
then
catch
方法

长话短说,当使用异步API时,有一种特定的编码方式,它支持事件驱动的方法。考虑下面的体系结构:

var eventBus = new EventEmitter()

eventBus.on('address', (addr) => {
  // do something with address
})

asyncGetAddress().then(addr => {
  eventBus.emit('address', addr)
})

另请参见:

return resolve(yourData)应为您提供.then函数中可用的数据。我可以使用.then函数中的数据,但我希望函数在调用时返回一个值。函数只能返回承诺,而不能返回数据。当函数返回时,数据还不可用。是否有一种方法返回数据而不是承诺?请澄清:是否有可能以这种方式获取数据:const somePlaceAddress=getAddress(('somePlace'))如果
getAddress
的结果是承诺(在您的情况下是这样的)我认为您对代码中所有
return
语句的效果感到困惑。显然你希望他们做一些他们真正不做的事情。事实上,它们对你的情况没有任何影响。如果您将它们全部删除,代码将具有相同的行为(当然,
返回新承诺除外)。
var eventBus = new EventEmitter()

eventBus.on('address', (addr) => {
  // do something with address
})

asyncGetAddress().then(addr => {
  eventBus.emit('address', addr)
})