2017-07-30 209 views
4

我剛剛升級到節點8,並想開始使用異步/等待。我偶然發現了一個錯誤,這讓我花了一段時間才解決,而我實際上只是想知道是否有更優雅的方式。我不想在這個時候重構整個函數,因爲它會導致所有次要的重構。在promise鏈中使用await

async doSomething(stuff) { 
... 

    return functionThatReturnsPromise() 
    .then((a) => ...) 
    .then((b) => ...) 
    .then((c) => { 
     const user = await someService.createUser(stuff, c); 
     user.finishSetup(); 
    }); 
}; 

有什麼辦法能在承諾連鎖使用await而無需重構上面的一切是async呢?

+3

應該不是被'。然後(異步(C)=> {'是在所有有效? –

+0

這可能是我之前這個搗亂的時候錯過了......我已經包裹在全產業鏈一個異步IEFE。謝謝! –

+0

在這個簡單的例子中,我不需要等待,但是在我有的真實代碼中,有些東西需要對用戶進行操作。 –

回答

4

該回調未聲明爲async函數。您只能在async函數內直接使用await a Promise

async doSomething(stuff) { 
// ... 

    return functionThatReturnsPromise() 
    .then((a) => /* ... */) 
    .then((b) => /* ... */) 
    .then(async (c) => { 
     const user = await someService.createUser(stuff, c); 
     return user; 
    }); 
}; 

而且,你不應該需要使用then如果你正在利用async功能。

async doSomething(stuff) { 
// ... 

    const a = await functionThatReturnsPromise(); 
    const b = // ... 
    const c = // ... 
    const user = await someService.createUser(stuff, c); 
    return user; 
}; 
+0

是的,我現在明白了@Jaromanda X的感謝。我也明白,如果我將整個函數轉換爲async/await,這不是一個問題,但這是應用程序的核心功能,我寧可不觸摸比我更多,因此努力保留承諾鏈,並添加我需要的新作品。 –

+0

如果我將整個函數轉換爲async/await_,你的意思是什麼?你可以在'async'函數內'等待'Promise'。 –

+0

現在整個功能是一個長期的承諾鏈。我想避免將鏈中的每個「鏈接」轉換爲「等待」。 –