2017-08-22 163 views
-3

我不明白鏈如何承諾:JS:嵌套承諾

getUser是一個承諾功能,並且還search是一個承諾的功能。 getUser將返回一個語言值。

有了這些數據是不是數組值,這應該由search功能

getUser(userId) 
    .then(({ language }) => { 
    const data = search('content', language) 
    res.send(200, { 
     content: data, 
     user: { language } 
    }) 
    }) 
    .catch((error) => next(error)) 
+1

沒有你已經問這個,並得到一個答案嗎?像一個小時前? –

回答

1

爲了避免嵌套,你可以使用Promise.all:這將允許您通過鏈條傳遞language值,以及:

getUser(userId) 
    .then(({ language }) => 
     Promise.all([language, search('content', language)]) 
    ).then(([language, data]) => 
     res.send(200, { 
      content: data, 
      user: { language } 
     }) 
    ).catch((error) => next(error)) 
+1

請問downvoter請解釋這個答案有什麼問題? – trincot

+0

不是downvoter,但我很好奇你爲什麼在這裏使用'promise.all'。語言是一種承諾嗎?它看起來像getUser的返回值。爲什麼你不能只返回'search()'的承諾? –

+1

當您只返回'search()'promise時,當調用res.send時(在平鏈模型中),您將無法訪問'language'。注意:'Promise.all'可以處理數組中的非預期值。在這種情況下,它會將這些值視爲立即解決的承諾。 – trincot

0

如果search返回一個承諾,那麼你需要使用.then()以訪問該承諾的數據返回。你應該爲了能夠在更高級別的鏈接返回承諾:

getUser(userId) 
    .then(({ language }) => { 
    return search('content', language) 
     .then((data) => { 
     res.send(200, { 
     content: data, 
     user: { language } 
     }); 
    }) 
    .catch((error) => next(error)) 

需要注意的是,通常你可以避開築巢返回由search()返回的承諾,後來鏈接另一.then()電話,但因爲你試圖從原始方法調用中捕獲語言參數,您需要將該值置於範圍內。 Trincot的答案顯示瞭如何獲得language的價值以獲得更好的鏈接。