【问题标题】:Promisify a JavaScript callback functionPromisify 一个 JavaScript 回调函数
【发布时间】:2021-08-01 08:58:43
【问题描述】:

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

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

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

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

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

};

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

【问题讨论】:

  • 你的承诺代码是什么样的?
  • 我刚刚更新了问题。你能帮忙吗?

标签: javascript asynchronous callback


【解决方案1】:

你的两个例子都不正确

使用延续传递风格

在这种风格中,延续(“回调”)忽略任何 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,它表示未来计算的值。您可以在async 函数中await 一个promise 以检索结果,或链接.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"

【讨论】:

  • 哇,这篇文章写的很透彻,写的很棒。我唯一的问题是我以前这样定义地理编码器: const geocoder = new kakao.maps.services.Geocoder();所以我对你答案的第一行有疑问。你有什么建议吗?
  • 我在示例中使用了geocoder 的“假”实现,因此我们可以看到它们是如何工作的,并且可以在您自己的浏览器中的站点上进行测试。如果kakao.maps.services.Geocoder 以延续传递风格编写,您将像我们在第一个示例中那样编写getCoords。如果Geocoder 提供了基于promise 的API,您将像我们在第二个示例中那样编写getCoords
  • 注意,如果是用回调的方式写的,很有可能会跟随Node的error-first callback convention。请参阅this Q&A 了解更多说明,参阅this Q&A 了解如何与asyncawait 一起使用的示例。如果您在那之后遇到困难,请记录您正在使用的库的链接,我会尝试调查它。
猜你喜欢
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2021-11-06
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多