【问题标题】:Angular & async / await角度和异步/等待
【发布时间】:2018-07-08 17:33:16
【问题描述】:

我在我的 Angular 应用程序中使用以下内容:

let getName = greenlet( async username => {                     
    let url = `https://api.github.com/users/${username}`        
    let res = await fetch(url)                                  
    let profile = await res.json()                              
    return profile.name                                          
})                                                              

console.log(await getName('developit'));     

Angular 似乎正在将这个“等待”改为“产量”:

如何在我的 Angular5 应用程序中使用它?谢谢。

【问题讨论】:

  • 您的代码示例是否被另一个异步函数包围?否则你不能在 console.log 调用中使用 await。 getName 内部的逻辑看起来不错。
  • 它只是位于 ngOnInit 生命周期钩子中。
  • 我想有一些步骤可以将 ES8 转换为 ES6。然而,实际上转译器应该首先抛出一个语法错误。

标签: javascript angular asynchronous async-await


【解决方案1】:

Babel 将浏览器中的 async/await 更改为使用 yield 关键字的生成器函数。收益只有在正确的上下文中才有效;具体来说,下一阶段将确保 yield 出现在生成器函数中(您可以阅读有关生成器的更多信息,但基本上它们在函数签名中由 * 标识,例如 function *doSomething()

如果您没有正确管理您的 async 关键字,则不会创建生成器函数。 Babel 会将该 await 转换为生成器,但由于外部函数不是异步的,它不会创建生成器包装器,因此会出现错误。一些 IDE 会在您编译之前报告此错误,但这就是您看到的错误的含义。

您提到此 console.log 位于 ngOnInit 生命周期钩子中;该函数调用本身并不是异步的。你可以用异步来装饰它,但我不建议这样做(它有效,但它实际上是什么意思?)。相反,您可以尝试显式调用 async 函数并忽略返回的承诺:

ngOnInit() {
    this.someFunction();
}

async someFunction() {
    console.log(await getName('developit'));
}

我们现在假设greenlet 知道如何处理它已交给它的异步函数(它会解决承诺吗?)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多