2017-05-05 47 views
0

我有一個令人困惑的問題:如何第一個應許的返回值傳遞給最後一個鏈式承諾

我使用的承諾鏈調用幾個功能如下:

CommonPromiseLists.checkStatusPromise().then(CommonPromiseLists.getChannelPreferencePromise).then(CommonPromiseLists.getChannelsPromise).then(getUniqueStory.bind(null, storyId)) 

正如你所看到的,函數因此被調用,並且我得到了正確的結果。然而,基於最近的需求變化,我需要將CommonPromiseLists.checkStatusPromise()的返回值傳遞給getUniqueStory.bind(null,storyId),這是我調用的最後一個承諾。我有一個解決方案:所以無論何時我返回並將返回值交給下一個承諾,我都可以包含第一個承諾的返回值。但我相信應該有一個更簡單的方法。有沒有更好的方法可以獲取checkStatusPromise()的返回值並將其傳遞給getUniqueStory.bind(null,storyId,第一個promise的返回值)?

+0

是否使用通天編譯代碼? – gargantuan

+0

@gargantuan是的,我做 –

回答

2

你可以通過承諾鏈的結果,但使代碼緊密耦合,要求後續回調預測一個奇怪的結構作爲解決的價值。

使用簡單的承諾,更簡單的方法是將回調中的其餘操作包含在內。那樣,checkStatusPromise的結果就暴露了。

CommonPromiseLists.checkStatusPromise().then(res => { 
    return CommonPromiseLists.getChannelPreferencePromise(res) 
    .then(CommonPromiseLists.getChannelsPromise) 
    .then(getUniqueStory.bind(null, storyId, res)) // access res 
}); 

如果你可以使用異步的await,它變得更容易一點:

async enclosingFunction(){ 
    const status = await CommonPromiseLists.checkStatusPromise(); 
    const channelPreference = await CommonPromiseLists.getChannelPreferencePromise(status); 
    const channels = await CommonPromiseLists.getChannelsPromise(channelPreference); 
    const uniqueStory = await getUniqueStory.bind(null, storyId, res) 
    return uniqueStory; 
} 

enclosingFunction().then(value => /* results */) 
+0

非常感謝你的完整答案我很感謝 –

0

只需保存的結果,如果你需要:

let res; 
func1().then(result=>{ 
    res = result; 
    return func2(); 
}) 
.then(func3) 
.then(func4) 
... 
then(result=>{ 
    ... 
    return res; //return result that you save as result of the first promise 
}) 
.catch(err=>{ 
    throw err; 
}) 

如果你想省略一些步驟,你可以這樣做:

let res; 

func1().then(result=>{ 
    res = result; 
    if(res) //you check of the result 
     return func2().then(func3); 
    else 
     return func4(); 
}) 
then(result=>{ 
    ... 
    return res; //return result that you save as result of the first promise 
}) 
.catch(err=>{ 
    throw err; 
}) 
+0

因此,我可以發送res到fun4,或者我應該等待所有的電話完成? –

+0

如果你想省略一些步驟,請參閱我改變了答案 – Sergaros

1

承諾可能不是你需要在這裏使用的。它看起來像你需要一個發電機或異步/等待。我會在這裏使用異步/等待,因爲它可能更容易理解。

試想一下,你有一個返回這樣

function double(someVal) { 
    return new Promise(resolve => { 
     setTimeout(() => { 
      resolve(someVal * 2); 
     }, 2000); 
     }); 
} 

你可以使用異步/等待這樣

async function sumMultiplications() { 
    var a = await double(5); 
    var b = await double(20); 
    var c = await double(a); 
    return a + b + c; 
} 

當異步函數被調用一個承諾的功能,它返回一個諾言。當異步 函數返回一個值時,Promise將使用返回值 解析。當異步函數拋出異常或某些值時,Promise將被拋出的值拒絕。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

+0

非常感謝你的回答。對於任何人看到這篇文章,我會建議閱讀這個答案,以獲得更好的想法 –

相關問題