2015-04-06 109 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。 –

相關問題