2015-04-06 15 views
6

Nel mio codice client Meteor, sto cercando di utilizzare un'API di terze parti che ha solo chiamate asincrone. Come posso utilizzare Meteor.wrapAsync sul client per effettuare chiamate a questa API in uno stile sincrono? La documentazione sembrano indicare che questo è possibile: http://docs.meteor.com/#/full/meteor_wrapasyncCome utilizzare Meteor.wrapAsync sul client?

Ecco alcuni esempi di codice mi piacerebbe chiamare in uno stile sincrono:

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()'); 
}; 

Attualmente, questo produce questo output:

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

Mi piacerebbe produrre:

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

Ho messo questo merluzzo e in un MeteorPad qui: http://meteorpad.com/pad/fLn9DXHf7XAACd9gq/Leaderboard

+0

Questo non è possibile, l'ambiente del browser è asincrono di progettazione, vedere questa risposta per maggiori informazioni sul motivo per cui 'Meteor.wrapAsync' è definito sul client ma si risolve in un comportamento di callback: http://stackoverflow.com/questions/26058205/meteor-wrapasync-syntax/26058613 # 26058613 – saimeunt

risposta

2

Meteor.wrapAsync funziona sul client per il codice isomorfo. In questo modo è possibile creare codice che è possibile condividere sul client e sul server senza che Meteor si blocchi o si lamenti.

Non è possibile avere il codice sincrono sul client. Almeno senza utilizzare le funzionalità di ES6 che non sono disponibili su tutti i browser.

Come nel commento di saeimeunt, Meteor.wrapAsync richiede una richiamata sul client.

+0

Quindi è disponibile per chiamare il client, ma restituisce funzioni non funzionanti 'Impossibile effettuare una chiamata HTTP bloccante dal client; richiesto callback., per me non è realmente isomorfo! (Lo so, non è colpa tua). IMHO, potrebbe restituire una funzione di ritorno di Promise, per essere alquanto utile sul client, per de-nodificare. –

Problemi correlati