【问题标题】:async/await not working in forEach [duplicate]异步/等待在 forEach 中不起作用 [重复]
【发布时间】:2016-12-05 11:32:34
【问题描述】:

forEach 中尝试使用 async/await 时获取意外令牌

    export let appState = observable({
        bunny : []
    });

    appState.loadBunny = async function(bugs) {
    bugs.forEach(function(data) {
        let temp = {};
        temp['id'] = data.id;
        temp['site_url'] = data.site_url;
        temp['email'] = await decrypt(sessionStorage.getItem('key'), data.email);
        temp['username'] = await decrypt(sessionStorage.getItem('key'), data.username);
        temp['password'] = await decrypt(sessionStorage.getItem('key'), data.password);
        temp['note'] = await decrypt(sessionStorage.getItem('key'), data.note);
        temp['tag'] = await decrypt(sessionStorage.getItem('key'), data.tag);
        temp['created_at'] = data.created_at;
        temp['updated_at'] = data.updated_at;
        runInAction("update state after decrypting data", () => {
            this.bunny.push(temp);
        });

    });
};

    appState.fetch = async function() {
        let xoxo = await axios.get('/api/vault/', {
            headers: {'Authorization': "JWT " + sessionStorage.getItem('token')}
        });
        this.loadBunny(xoxo.data);
    }

这是错误:

ERROR in ./static/apps/store/passwords.js
Module build failed: SyntaxError: ...static/apps/store/passwords.js: Unexpected token (15:30)
  13 |         temp['id'] = data.id;
  14 |         temp['site_url'] = data.site_url;
> 15 |         temp['email'] = await decrypt(sessionStorage.getItem('key'), data.email);
     |                               ^
  16 |         temp['username'] = await decrypt(sessionStorage.getItem('key'), data.username);

【问题讨论】:

  • 您只能在async 函数中使用await

标签: javascript asynchronous async-await ecmascript-6


【解决方案1】:

await 仅在 async 函数中有效,如下所示:

async function test() {
    await myObj.setObj(2, 3);

    console.log(obj.a + obj.b);
}

test();

因此,您应该重构您的代码,以便那些 await decrypt(sessionStorage.getItem('key'), data.email 调用位于它们自己的 async 函数中。

【讨论】:

    【解决方案2】:

    await应在async函数中使用,在forEach回调中使用,为普通函数。

    即使async 函数作为forEach 回调提供,也无法获得承诺,因为forEach 没有返回任何内容。

    为此,应手动形成承诺链。

      appState.loadBunny = async function(bugs) {
        let promise = Promise.resolve();
    
        bugs.forEach(function(data) {
          promise = promise.then(async function () {
            let temp = {};
            ...
          });
        });
    
        await promise;
      }
    

    这就是for...ofasync 函数中必不可少的原因:

      appState.loadBunny = async function(bugs) {
        for (const data of bugs) {
          let temp = {};
          ...
        });
      }
    

    生成器函数和yield 在这种情况下的行为相似。

    【讨论】:

    • 其实forEach什么都没有返回。
    • @Bergi 当然,感谢您注意到这一点。
    猜你喜欢
    • 2018-01-27
    • 2019-06-29
    • 2017-01-11
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2019-12-19
    • 2021-06-26
    相关资源
    最近更新 更多