node.js - 这个异步转换的承诺是否正确,为什么不需要等待?
问题描述
我有这个带有承诺的代码片段。
function f (number) {
return new Promise((resolve, reject) => {
if (number === 42) {
resolve({ success : "bar" })
}
reject({ bar : "foo" })
})
}
f(42)
.then(success)
.catch(bar);
f(43)
.then(success)
.catch(bar);
function success(input) {
console.log(input)
}
function bar() {
console.log("marianna")
}
然后尝试将 Promise 转换为 async/await 语法:
async function f (number) {
if (number === 42) {
return { success : "bar" }
}
throw { bar : "foo" }
}
f(42)
.then(success)
.catch(bar);
f(43)
.then(success)
.catch(bar);
function success(input) {
console.log(input)
}
function bar() {
console.log("marianna")
}
两个脚本给出的输出是相等的。我认为转换是正确的,但我仍然很难“读取”异步代码。
无论如何,..为什么没有必要等待?什么时候需要等待?
解决方案
await
可以提高代码阅读能力。它将asynchronous
函数调用视为synchronous
调用。
在您的示例中,假设我是否想在完成f(43)
后运行f(42)
。对于这种情况,我可以在下面这样做
f(42)
.then(() => {
success();
return f(43);
})
.then(success)
.catch(bar);
比较await
async function f (number) {
if (number === 42) {
return { success : "bar" }
}
throw { bar : "foo" }
}
async function run() {
try {
const result42 = await f(42); // async function but called like sync function
success(result42);
const result43 = await f(43);
success(result43);
} catch(error) {
bar(error);
}
}
run();
function success(input) {
console.log(input)
}
function bar() {
console.log("marianna")
}
推荐阅读
- html - 如何截断 Bootstrap 卡片页脚文本?
- c - 如何重新分配不同大小的二维结构指针
- arrays - 执行命令后使用 sed 删除换行符并将其保存在数组中
- c - 使用 DYLD_INSERT_LIBRARIES 的 macOS 自定义 malloc/free 加载得不够早
- c++ - 如何创建一个适用于 lambda 表达式的排序函数?
- powershell - 无法识别的参数“计算机名”。所有参数必须以“-”开头
- java - 有没有办法循环遍历 2 个数组并打印数组 1 的元素,如果它包含数组 2 中任何元素的子字符串?
- java - 无法从另一个 docker 容器连接到 docker 容器中的 mysql
- process - 创建进程或线程哪个更快?为什么?
- python - Python - 拆分列表以获取最小值和最大值