2015-04-06 108 views
6

在我的Meteor客户端代码中,我试图使用只有异步调用的第三方API。如何在客户端上使用Meteor.wrapAsync以同步方式调用此API?该文档似乎表明这是可能的:http://docs.meteor.com/#/full/meteor_wrapasync如何在客户端上使用Meteor.wrapAsync?

下面是一些示例代码,我想在一个同步的风格调用:

var func1 = function(callback) { 
    Meteor.setTimeout(function() { 
    console.log('func1 executing'); 
    callback(null, {success: true}); 
    }, 2000); 
}; 

var func2 = function(callback) { 
    Meteor.setTimeout(function() { 
    console.log('func2 executing'); 
    callback(null, {success: true}); 
    }, 1000); 
}; 

var wrapped1 = Meteor.wrapAsync(func1); 
var wrapped2 = Meteor.wrapAsync(func2); 

Template.test.rendered = function() { 
    wrapped1(); 
    console.log('After wrapped1()'); 
    wrapped2(); 
    console.log('After wrapped2()'); 
}; 

目前,这产生这样的输出:

After wrapped1() 
After wrapped2() 
func2 executing 
func1 executing 

我想制作:

func1 executing  
After wrapped1() 
func2 executing 
After wrapped2() 

我把这个鳕鱼e进入MeteorPad:http://meteorpad.com/pad/fLn9DXHf7XAACd9gq/Leaderboard

+0

这是不可能的,浏览器环境是由设计异步,请参阅这个答案更多关于为什么'Meteor.wrapAsync'定义在客户端,但解决回调行为:http://stackoverflow.com/questions/26058205/meteor-wrapasync-syntax/26058613#26058613 – saimeunt

回答

2

Meteor.wrapAsync为了同构代码而在客户端上工作。这样你就可以制作代码,在没有Meteor崩溃或抱怨的情况下,你可以在客户端和服务器上共享代码。

在客户端上不可能有同步代码。至少不使用在所有浏览器上都不可用的ES6功能。

正如saeimeunt的评论Meteor.wrapAsync将需要在客户端回调。

+0

所以它可以在客户端上调用,但它返回中断函数'不能从客户端发出阻塞HTTP调用;需要回调。“,这对我来说并不是真的同构! (我知道,不是你的错)。恕我直言,它可以返回一个Promise返回函数,在客户端上有些用处,ala de-nodeify。 –