2016-02-17 38 views
0

_stats.value()本身就是一個解決的承諾。許多方法都需要它,如下所示。所有這些方法都接受_stats作爲論點。如何在承諾鏈中使用相同的值?

爲了簡單起見,我只使用方法名稱,不調用函數內的函數從方法返回_stats

我想更簡單去除.return電話

return Promise.resolve() 
    .then(removeYesterdayKeys) 
    .then(renameTodayKeys).return(_stats.value()) 
    .then(removeStatsOfToday).return(_stats.value()) 
    .then(addStatsOfToday).return(_stats.value()) 
    .tap(console.log.bind(console)) 
+0

你真的需要按順序執行它們? – Bergi

+0

所有這些方法返回什麼? – Bergi

+0

@Bergi是的,他們是連續的。這些方法不會返回任何內容。例如:removeStatsOfToday(stats) –

回答

0

事實上,與下劃線你可以做這樣的:

var feedStatsTo = function(f) { return _.partial(f, statsOfToday); }; 

return Promise.resolve() 
    .then(removeYesterdayKeys) 
    .then(renameTodayKeys) 

    .then(feedStatsTo(removeStatsOfToday)) 
    .then(feedStatsTo(addStatsOfToday)) 

    .return(statsOfToday) 
    .tap(console.log.bind(console)) 
0

您可以將幾個.then到一個承諾:

var p = Promise.resolve('foo'); 
p.then(bar); 
p.then(baz); 

兩個barbaz將收到'foo'當作它們的參數。

然而,鏈接到一個.then意味着未來函數將接收先前.then的輸出作爲自變量:

p.then(bar).then(baz); 

baz接收任何bar回報。

這是它的工作方式,選擇哪一個對你的情況有用。也許一個回調裏面執行barbaz會是最有用的嗎?承諾僅應解決異步執行問題;不要將它們用於同步代碼,因爲鏈條看起來不錯。

+0

謝謝,但這不是我正在尋找的解決方案。我也不同意承諾只是爲了解決異步問題。他們也是爲了防止末日金字塔。我想保持我的代碼簡單。 –

+1

@deeperx Promise不會阻止同步代碼中的厄運金字塔(例如,嵌套的if(){}或for(){},它們只能解決基於回叫的厄運金字塔, async。 –

+0

@MadaraUchiha當然,我是在異步談話 –

0

如果你不想.return()電話,也不想改變你的方法,你唯一的選擇是通過函數表達式:

return _stats.value().then(function(stats) { 
    return removeYesterdayKeys() 
     .then(renameTodayKeys) 
     .then(function(_) { return removeStatsOfToday(stats); }) 
     .then(function(_) { return addStatsOfToday(stats); }) 
     .then(function(_) { console.log(stats); return stats; }); 
}); 

,或者更接近你原來的例子,但不一定要好:

return removeYesterdayKeys() 
    .then(renameTodayKeys) 
    .then(function(_) { return _stats.value().then(removeStatsOfToday); }) 
    .then(function(_) { return _stats.value().then(addStatsOfToday; }) 
    .then(function(_) { return _stats.value().tap(console.log.bind(console)) }); 

如果你正在尋找一個真正優雅的方式,你當然應該採取的異步/的await提案(和它的實驗實現)偷看。

+0

謝謝,我只是想知道是否有更好的方法,我現在看到現在沒有,我非常興奮異步/等待。 –