2016-07-31 66 views
3

工作嘗試使用異步/地等待着forEach異步/伺機不在的forEach

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); 
+0

您只能在'async'函數中「await」。 – zerkms

回答

3

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行爲類似於在這種情況下。

+0

其實'forEach'不會返回任何東西。 – Bergi

+0

@Bergi當然,謝謝你注意到這一點。 – estus

3

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函數內。