【问题标题】:Javascript - async await not wait until function is done?Javascript - 异步等待不等到功能完成?
【发布时间】: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 异步。
  • 另一种选择是使用承诺或回调。 asyncawait 只是 promise 的语法糖。
  • const result = 0 中的const 不应该是let 吗?应该定义一个常量,但不能重新分配。
  • 如果您不想将所有函数更改为异步函数。考虑不要在func2 中调用异步,而是将func1 的解析结果作为参数传递给func2func1().then(func2) 这将允许您将 func2 定义为 const func2 = result => {console.log(result); return result;}
  • ALL await 所做的是暂停当前函数的执行,然后立即向调用者返回一个承诺。调用者必须对这个承诺做一些事情,才能知道函数何时真正完成。如果调用者也没有等待返回的承诺或没有使用.then() 知道它何时完成,那么调用者将永远不会知道它何时完成并且永远不会“等待”任何事情。这就是async/await 的工作原理。 await 暂停函数的执行并立即向调用者返回一个承诺。 await 不会暂停整个解释器。

标签: javascript async-await es6-promise


【解决方案1】:

正如 cmets 中所述,两个函数都必须是异步的才能使用 await。这可以在下面的代码 sn-p 中看到。 (因为我不想在示例中调用实际的服务器,所以我在 putCallToServer() 中抛出。这是返回 2 的结果。

我还将 result 更改为 let 变量,因为您试图 mut 一个不允许的 const。

async function putCallToServer() {
 throw "too lazy to make a real error"
}
// func1
const func1 = async() => {
   try {
     await putCallToServer();
     return 1;     // it returns as a promise
   } catch(ex) {
     return 2;
   }
}

// func2
const func2 = async() => {
   let result = 0;
   result = await 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()

【讨论】:

  • 谢谢!那么接下来,如果我有一个调用 func2 的 func3,我需要将 func3 设为异步并在内部使用 await 调用 func2?
  • 是的。为了使用 await,您调用的函数和调用的函数都需要异步。
  • 谢谢!在这里我看到当你调用fun2 时,你只是调用fun2,而不是await fun2,我看到它一直是这样使用的,但这是为什么呢?是不是因为这里的caller是windows?
  • 或者类似(async() => await func2())() ?
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2019-05-31
  • 2023-01-20
  • 2019-06-16
  • 2018-03-05
  • 2018-03-30
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多