等待javascript中的异步调用不在Node js中的console.log中

问题描述 投票:1回答:1

我已经读了几个小时的承诺,我在这里失去了理智。根据我在SO中阅读的内容和谷歌上的文章。要获取变量中的响应值,我必须使用async和await。所以走了那条路我写了这段代码:

async function getZpid() {

let response = await function getZillowZpid(){
zillow.get('GetSearchResults', parameters)
    .then(results => {
      let zpidResponse = results.response.results.result[0].zpid;
      console.log("i ran");
      return zpidResponse;
  });
}

}

getZpid();

在这里,我希望当getZpid()运行“响应”时,等待函数get ZillowZpid完成。一旦它完成它将console.log“我跑”然后返回zpidResponse。

我没有错误,但console.log永远不会出现。最终console.log只是一个测试,我想要做的是将zpidResponse输入到我可以在函数外部使用的变量。任何帮助将不胜感激!

javascript
1个回答
2
投票

您正在使用await function getZillowZpid()定义一个无法调用的无关函数。这就是您没有看到任何错误或结果的原因。如果您在上面的函数中记录变量response,您将看到它是[Function: getZillowZpid],您已经定义了一个函数并将其分配给response,这肯定不是您想要的。

由于zillow.get返回一个承诺,你可以等待它。这是一个模拟zillow对象的示例:

// fake the zillow object
let zillow = {
  get() {
    return Promise.resolve({response: {results: {result: [{zpid: "Some data"}]}}})
  }
}

async function getZpid() {
  let parameters = {}
  // zillow.get returns a promise, you can use await to get the returned value
  let response = await zillow.get('GetSearchResults', parameters)
      .then(results => {
        let zpidResponse = results.response.results.result[0].zpid;
        console.log("i ran");
        return zpidResponse;
    });
  
  console.log(response)
  }
  
  getZpid();
  

仅供参考,如果你正在使用async/await它更清洁,以避免then()虽然你仍然应该添加一些错误检查:

// fake zillow
let zillow = {
  get() {
    return Promise.resolve({response: {results: {result: [{zpid: "Some data"}]}}})
  }
}
async function getZpid() {
  let parameters = 0
  let response = await zillow.get('GetSearchResults', parameters)
  let zpidResponse = response.response.results.result[0].zpid;
  console.log(zpidResponse)
  return zpidResponse
  }

  getZpid();
  
© www.soinside.com 2019 - 2024. All rights reserved.