ES6/7 等待异步函数

Posted

技术标签:

【中文标题】ES6/7 等待异步函数【英文标题】:ES6/7 await for async function 【发布时间】:2017-09-14 11:27:18 【问题描述】:

我读到了await 停止执行,而承诺没有得到解决。我正在尝试在我的 React-native 应用程序中执行以下操作:

static async getFromStorage(key) 
  const value = await AsyncStorage.getItem(key);
  console.log(value);
  return value;


console.log(Class.getFromStorage("test"));

但我得到以下而不是实际值(Chrome 不允许我复制时间戳...):

Promise _45: 0, _81: 0, _65: null, _54: null 100 毫秒后 REAL_VALUE

那么为什么我的代码不等待解决承诺?

更新

@thedude 建议:

async function waitForStorage() 
   console.log(await getFromStorage());

waitForStorage();

这个解决方案的问题我需要在课堂上使用它。但是当我做someVar = await getFromStorage() 时,我得到一个 500 错误。我可以等它,因为它是 100 毫秒。

例如:

someVar = await getFromStorage("token");
checkToken(someVar);

【问题讨论】:

你使用的是 babel 之类的编译器吗?并非所有地方都支持 es6/7。关于 async await 的全部意义在于以同步方式编写异步代码。在 await 语句之后的任何内容都不应执行,直到正在等待的 promise 被解决或拒绝。 “这个解决方案的问题是我需要它全局并立即在课堂上我想要使用的东西” 这不是 async/await 解决的问题。没有什么能解决这个问题。使用回调或使一切异步。即使您使用了异步,它仍然不会立即全局可用。 @PumpkinSeed 我没有对你投反对票。我很少投反对票,我试图帮助他们——如果我投反对票,我会发表评论让他们知道原因。在我看来,不加评论就投反对票的人是巨魔。 除非你的调用函数不是异步的。 async 不仅神奇地使异步代码同步运行;它只是将回调隐藏在你必须添加回调的 Promise 后面。它不会也无法解决您的设计问题。 FWIW,异步函数是 ES2017 的一部分,而不是 ES6 或 ES7 的一部分。 【参考方案1】:

运行console.log的代码也应该标记为async,它也应该awaitgetFromStorage的返回值;

例如这会起作用:

async function waitForStorage() 
   console.log(await getFromStorage());

waitForStorage(); // now the console messages should be in the correct order

或者你可以等待承诺的解决:

getFromStorage("token").then(someVar => checkToken(someVar))

【讨论】:

我更新了帖子,因为这不是我真正想要的。 @PumpkinSeed 是不可能的,除非你用async 标记调用await 的范围。最简单的解决方案就是等待承诺,例如getFromStorage("token").then(someVar => checkToken(someVar)) 是的,我做到了,谢谢。请问可以更新帖子吗? 我们也可以这样做吗? async waitForStorage: () =>

以上是关于ES6/7 等待异步函数的主要内容,如果未能解决你的问题,请参考以下文章

异步函数 - 等待不等待承诺

在映射下一项之前,异步等待映射不等待异步函数在映射函数内部完成

有没有办法在异步函数中等待多个等待调用?

等待异步函数在 dart 中无法正确执行

异步等待不等待完成

如何等待异步函数 Swift