2017-10-08 104 views
1

閱讀文檔按照我的理解中ES6的含義:從ES6箭解決的諾言功能

foo => someFun(foo); 

等同於:

foo => { return someFun(foo); } 

我返回一個新的承諾和內使用箭頭函數調用拒絕方法的解決方法,例如

return new Promise(function(resolve, reject) 
{ 
    someFunThatReturnsAPromise() 
    .then(data => resolve(data)) 
    .catch(err => reject(err)); 
}); 

因此在後來竟代碼,

.then(data => return resolve(data)) 

如果是這樣,它的問題是解決的結果(其中我不知道值的類型)和我應該改爲略少簡潔,使用寫{}防止隱式返回

.then(data => { resolve(data); }) 
+0

一些評論已經準確地表明內部承諾是不需要的。因此,請考慮原來的問題,但隨後修改爲「。然後(data => resolve(data.item))「,即執行一些額外的(儘管很輕微)處理 – const

+0

在任何情況下,避免['Promise'構造函數反模式](https://stackoverflow.com/q/23803743/1048572?什麼是承諾 - 構建 - 反模式 - 以及如何避免 - 它),並且不要將'resolve' /'reject'作爲回調傳遞給承諾! – Bergi

回答

0

如果你只是想返回數據,並拒絕櫃面一個錯誤,那麼你也不需要那麼()

return new Promise(function(resolve, reject) 
{ 
    someFunThatReturnsAPromise() 
    .then(data => resolve(data)) 
    .catch(err => reject(err)); 
}); 

將相當於

return someFunThatReturnsAPromise() 

,除非你想做的數據

+0

不應該('reslove,reject)=> {...})' – Stavm

+0

someFunThatReturnsAPromise()已經返回一個promise,爲什麼你想把它包裝在另一個promise中? – marvel308

+0

這是一個有效的問題。如果接下來的行是:然後(data => resolve(data.item))說 – const

0

resolve功能已經返回undefined一些處理,所以完全不會有什麼區別,如果你含蓄與歸還一行箭頭函數或根本不從函數體返回它(因爲後者意味着函數體隱式返回undefined本身)。

此外,由於您已將someFunThatReturnsAPromise()返回的承諾包裝在新的承諾中,因此無論如何都無法處理退貨,因此即使返回了某些東西也不會有任何區別。

更重要的是,你在新承諾中包裝承諾的方式是反模式。 new Promise()構造僅用於處理尚未基於承諾的異步過程。
由於someFunThatReturnsAPromise()已經返回一個承諾,你不需要把它包裝在一個新的,只需使用你得到的一個!
對於您的示例,它可以簡單地意味着它返回:

return someFunThatReturnsAPromise() 

如果你想要做一些數據的處理,比如只返回數據的一部分(在下面的例子中,status屬性),你這樣做,在一個then回調:

return someFunThatReturnsAPromise().then(data => data.status) 

當您在then回調返回,它又會返回一個新的承諾,得到與你返回的數據解析(除非你回到另一個承諾,在這種情況下,它會當該承諾解決時解決)。
通過鏈接異步過程及其結果,這就是承諾的工作原理。

+0

太好了。我從你的其他評論中認識到,外在的諾言是不需要的。在我的實際代碼中,我已經能夠刪除一堆這些,這減少了代碼的大小。它還解決了外層Promise改變這種導致各種const self =這個現在已被刪除的綁定的問題。謝謝! – const