javascript - 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;
}
);
};
我只是想返回结果。如果有人能引导我朝着正确的方向前进,我将不胜感激。
解决方案
你的两个例子都不正确
使用延续传递风格
在这种风格中,延续(“回调”)忽略任何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"
推荐阅读
- javascript - 无法理解 javascript 函数的输出
- search - 如果使用欧几里得距离启发式的 A* 搜索允许对角线移动,它仍然是最优的吗?
- java - 注释和方法调用之间的 Mockito 区别
- python - 使用 tf.data 实现 tensorflow 输入管道时出错
- excel - 如何在 Excel 中创建部分字符串搜索功能,查看整个数组
- c - 如何化解这个二元炸弹阶段 4
- linux - 使用 NVidia GPU 的屏幕 EGL 显示
- javascript - 无法在网格 Sencha Extjs 中选择字段
- c - 我不明白为什么它不显示文件中的浮点数(二进制文件)
- excel - 在 Excel 中使用 VBA 为“Workbooks.Add”函数设置默认列宽