2016-11-09 92 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 
])