代码之家  ›  专栏  ›  技术社区  ›  FabricioG

javascript中的等待异步调用不存在控制台.log在节点js中

  •  1
  • FabricioG  · 技术社区  · 6 年前

    我已经读了几个小时关于承诺的书,我在这里发疯了。根据我在SO和google上读到的文章。要获得变量中响应的值,我必须使用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() 运行“response”将等待函数get ZillowZpid 要做的事。一旦完成,它就会 console.log

    我没有错,只是 控制台.log 从未出现。最终 只是一个测试,我想做的是让zpidsponse进入一个变量,我可以在函数外使用它。任何帮助都将不胜感激!

    1 回复  |  直到 6 年前
        1
  •  3
  •   Mark    6 年前

    await function getZillowZpid() 你从没打过电话。这就是为什么你看不到错误或结果。如果你记录变量 response [Function: getZillowZpid] ,您已经定义了一个函数并将其分配给 响应 这当然不是你想要的。

    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();