2016-07-31 15 views
3

unerwartetes Token erhalten, sobald in async/await forEachasync/await arbeiten nicht in 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); 
    } 

und hier ist der Fehler zu verwenden versuchen:

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

Sie können nur in einer Async-Funktion "erwarten". – zerkms

Antwort

3

await sollte in async Funktion verwendet werden, und es wird in forEach Rückruf verwendet, die regelmäßige Funktion ist.

Auch wenn async Funktion als forEach Rückruf zur Verfügung gestellt wird, kann ein Versprechen nicht erhalten werden, weil nichts zurückgibt.

Um dies zu tun, sollte Versprechen Kette manuell gebildet werden.

appState.loadBunny = async function(bugs) { 
    let promise = Promise.resolve(); 

    bugs.forEach(function(data) { 
     promise = promise.then(async function() { 
     let temp = {}; 
     ... 
     }); 
    }); 

    await promise; 
    } 

Dies ist der Grund, warum for...of in async Funktionen wesentlich ist:

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

Generator Funktionen und yield ähnlich in solchen Fällen verhalten.

+0

Eigentlich 'forEach' gibt nichts zurück. – Bergi

+0

@Bergi Sicher, danke, dass du das bemerkt hast. – estus

3

await funktioniert nur innerhalb einer async Funktion, wie folgt:

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

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

test(); 

Wie so, sollten Sie refactor Ihr Code, so dass diese await decrypt(sessionStorage.getItem('key'), data.email Anrufe innerhalb ihrer eigenen async Funktionen sind.