2012-11-02 1 views
8

Wie bekomme ich den Client method.call, um auf die Beendigung einer asynchronen Funktion zu warten? Aktuell erreicht es das Ende der Funktion und gibt undefiniert zurück.MeteorJS Async-Code innerhalb synchroner Meteor.methods-Funktion

Client.js

Meteor.call('openSession', sid, function(err, res) { 
    // Return undefined undefined 
    console.log(err, res); 
}); 

Server.js

Meteor.methods({ 
    openSession: function(session_id) { 
     util.post('OpenSession', {session: session_id, reset: false }, function(err, res){ 
      // return value here with callback? 
      session_key = res; 
     }); 
    } 
}); 
+0

Ich denke, es ist nicht möglich, asynchrone Aufgaben in Meteor-Methoden vom Client aus durchzuführen. In dem Server mit Fiber könnte eine Option sein. – Andreas

Antwort

6

Neuere Versionen von Meteor die undokumentierte Meteor._wrapAsync Funktion zur Verfügung gestellt haben, die eine Funktion mit einem Standard-(err, res) Rückruf dreht in eine synchrone Funktion, was bedeutet, dass die aktuelle Fiber bis zum Rückruf zurückgibt, und dann Meteor.bindEnviro verwendet um sicherzustellen, dass Sie die aktuellen Meteor-Umgebungsvariablen beibehalten (z. B. Meteor.userId()).

Eine einfache Anwendung würde wie folgt sein:

asyncFunc = function(arg1, arg2, callback) { 
    // callback has the form function (err, res) {} 

}; 

Meteor.methods({ 
    "callFunc": function() { 
    syncFunc = Meteor._wrapAsync(asyncFunc); 

    res = syncFunc("foo", "bar"); // Errors will be thrown  
    } 
}); 

Sie müssen unter Umständen auch function#bind verwenden, um sicherzustellen, dass asyncFunc mit dem richtigen Kontext aufgerufen wird es vor dem Verpacken. Für weitere Informationen siehe: https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

6

konnte ich die Antwort in this gist finden. Um asynchronen Code innerhalb einer Methode auszuführen, verwenden Sie Futures, die Ihre Funktion zwingt, zu warten.

+0

Ich würde vorschlagen, Zukunft/Versprechen, aber nicht bewusst, dass es in Meteor gebaut ist. Überall nützlich. – Dror

+1

Sie sind ein gerades G. Dies ist ein Schuss Anrufer Level-Code hier – OneChillDude

+1

Futures ist nicht mehr Teil des Meteor Core, so dass dies nicht mehr funktioniert. – iiz

0

Update: Entschuldigung, ich hätte die Frage sorgfältiger lesen sollen. Es sieht so aus, als ob diese Frage auch gestellt und beantwortet wurde here.

Abgesehen von Futures könnte ein anderes zu überprüfendes Muster darin bestehen, ein anderes Modell mit den vom asynchronen Aufruf zurückgegebenen Daten zu aktualisieren und dann die Änderungen dieses Modells zu abonnieren.


Vom meteor.call documentation sieht es aus wie das Ergebnis Argument (err, res) Ihrer Callback-Funktion sollte die Ausgabe Ihrer Open Funktion enthalten. Sie geben jedoch keine Werte von Ihrer openSession-Funktion zurück, sodass der Rückgabewert nicht definiert ist.

Sie können dies testen:

Auftraggeber:

Meteor.call('foo', function(err, res) { 
    console.log(res); // undefined 
}); 

Meteor.call('bar', function(err, res) { 
    console.log(res); // 'bar' 
}); 

Server:

Meteor.methods({ 
    foo: function() { 
    var foo = 'foo'; 
    }, 
    bar: function() { 
    var bar = 'bar'; 
    return bar; 
    } 
});