【发布时间】:2020-08-10 01:36:34
【问题描述】:
我正在使用 async 和 await 学习 javascript,并自己尝试了一些示例,但似乎在从另一个函数 (func2) 调用异步函数 (func1) 时,func2 不会等待 func1 完成其进程并跳转结束并继续执行...我的代码有问题还是应该将 func2 转换为 async 并使用 await 调用 func1?如果是这样,这是否意味着所有涉及 async-await 方法的函数也需要变为 async ? 这是我的原始代码
// func1
const func1 = async() => {
try {
await putCallToServer(...);
return 1; // it returns as a promise
} catch(ex) {
return 2;
}
}
// func2
const func2 = () => {
let result = 0;
result = func1(); // should I turn it into await func1()??
console.log(result); // log contains '0' instead of '1' or '2'
return result; // return as Promise but value inside is 0
}
如果我有一个调用 func2 的 func3,我是否也应该将 func3 转换为 async-await 呢?
【问题讨论】:
-
是的,您需要
await func1()。这意味着您必须使func2异步。 -
另一种选择是使用承诺或回调。
async和await只是 promise 的语法糖。 -
在
const result = 0中的const不应该是let吗?应该定义一个常量,但不能重新分配。 -
如果您不想将所有函数更改为异步函数。考虑不要在
func2中调用异步,而是将func1的解析结果作为参数传递给func2。func1().then(func2)这将允许您将func2定义为const func2 = result => {console.log(result); return result;} -
ALL
await所做的是暂停当前函数的执行,然后立即向调用者返回一个承诺。调用者必须对这个承诺做一些事情,才能知道函数何时真正完成。如果调用者也没有等待返回的承诺或没有使用.then()知道它何时完成,那么调用者将永远不会知道它何时完成并且永远不会“等待”任何事情。这就是async/await的工作原理。await暂停函数的执行并立即向调用者返回一个承诺。await不会暂停整个解释器。
标签: javascript async-await es6-promise