2016-11-09 95 views
4

我一直在試圖避免流星迴調地獄,但首先,我會解釋我的問題:避免回調地獄。 Meteor.call承諾

我在服務器宣佈一些流星方法,我在他們使用的客戶端調用Meteor.call ,但主要問題是我有大量的回調使得調試成爲一項非常困難的任務(並且manteinance也是......)。如果我與一個「小」項目合作,這不會成爲問題,但我正在構建一個大項目,並且我計劃使用承諾,但令我吃驚的是......它不起作用,因爲Meteor.call只接受回調。

我已經讀了很多在這裏的職位和流星論壇,沒有人可以幫我......有什麼解決辦法嗎? (我試過deanius:承諾包,它仍然是相同的......)

編輯:使用流星1.4.2

回答

0

如今,ES7異步/等待是有幫助的 「回調麻煩」。見很好的解釋在這裏:http://rossboucher.com/await/#/10

async function() { 
    let result1 = await Do.Something(1); 
    let result2 = await Do.Something(2); 
} 
+0

我應該安裝任何軟件包來使用它?我有一個意想不到的令牌當我使用'await',否則,我得到了'undefined' – Droontar

+1

我終於找到了解決由於這一點,只需我不得不讓我的函數異步到能夠使用的await ...我創建一箇中間函數返回一個Promise,並在promise函數中,使Meteor.call – Droontar

+0

@Droontar擴展我的例子使用異步,使其更清晰。 –

0

可以使用bluebird模塊這一點。 promisifyAll讓您轉換的對象上的所有功能使用的承諾,而不是回調,所以不是使用Meteor.call有一個回調,您可以使用Meteor.callAsync當成了承諾。

隨着回調:

Meteor.call(..., function(...) { 
    // ... 
}); 

隨着承諾:

Meteor.callAsync(...).then(function(...) { 
    // ... 
}); 

http://bluebirdjs.com/docs/api/promise.promisifyall.html

+0

所以......使用'bluebird'需要修改這些方法的定義是什麼?或者只是簡單的'promisifyAll'我在哪裏調用方法?我的意思是,現在我的方法是'返回值;',只使用'promisifyAll'作品?或者我需要改變它像'返回新的承諾...'? – Droontar

+0

您可以在Meteor對象上調用'promisifyAll'。對於使用回調的'Meteor'對象的每個方法,'promisifyAll'自動創建一個使用promise的新方法。你可以正常地調用新的promisified方法。我添加了一個例子。 – afuous

+0

我不能使用Meteor.callAsync,它不是一個方法(控制檯)。我應該使用什麼軟件包?我使用npm one,'bluebird'。 – Droontar

0

圖書館像AsyncJS https://github.com/caolan/async是一個籠統的回答的問題 「厄運的回調金字塔」。

基本上取代電話像

Do.Something(1, function(result) { 
    Do.SomethingElse(2, function(result) { 
     Do.YetSomethingElse(3, function(result) { 
      .... 
     }) 
    }) 
}) 

隨着

asyncjs.series([ 
    function F1(callback) { 
     Do.Something(1, callback); 
    }, 
    function F1(callback) { 
     Do.SomethingElse(2, callback); 
    }, 
    ..... etc 
])