首页 > 解决方案 > Promisify 一个 JavaScript 回调函数

问题描述

我一直在阅读有关 async/await 和 Promises 的所有内容,但我无法让它发挥作用。我不断收到“承诺”,当它实现时,我收到“未定义”。

我想我已经花了大约两天的时间!我不确定出了什么问题。这是未承诺的版本。

  const getCoords = (address) => {
    geocoder.addressSearch(address, (result) => {
        return result;
      }
    );
  };

这是我对承诺代码的尝试:

  const getCoords = async (address) => {
     await geocoder.addressSearch(address, async (result) => {
        return result;
  }
);

};

我只是想返回结果。如果有人能引导我朝着正确的方向前进,我将不胜感激。

标签: javascriptasynchronouscallback

解决方案


你的两个例子都不正确

使用延续传递风格

在这种风格中,延续(“回调”)忽略任何return值,因为此函数与主调用异步运行 -

const geocoder =
  { addressSearch: (address, callback) =>
      setTimeout(callback, 1000, {
        coords: [12.345, 67.890]
      })
  }
  
const getCoords = (address, callback) =>
  geocoder.addressSearch(address, result =>
    callback(result.coords)
  )
  
getCoords("foobar", console.log)
// [ 12.345, 67.89]

[ 12.345, 67.89]

使用承诺

在这种风格中,您不指定延续。而是返回一个 Promise,它表示未来计算的值。您可以await在函数中承诺async以检索结果,或链接.then处理程序 -

const geocoder =
  { addressSearch: (address, callback) =>
      setTimeout(callback, 1000, {
        coords: [12.345, 67.890]
      })
  }
  
const getCoords = (address) =>
  new Promise(resolve =>
    geocoder.addressSearch(address, result =>
      resolve(result.coords)
    )
  )
  
async function main() {
  const coords = await getCoords("foobar")
  console.log(coords)
  return "done"
}
  
main().then(console.log, console.error)

[ 12.345, 67.89]
"done"

推荐阅读