2012-11-02 15 views
8

İstemci method.call, eşzamansız bir işlevi bitirmek için nasıl beklenir? Şu anda işlevin sonuna ulaşır ve tanımsız olarak döner.MeteorJS eşzamanlı senkronizasyon kodu Meteor.methods işlevi

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

Sanırım meteor yöntemleri içinde istemciden eşzamanlı olmayan görevleri gerçekleştirmek mümkün değil. Fiber kullanan sunucuda bir seçenek olabilir. – Andreas

cevap

6

Son versiyonları standart (err, res) geri arama fonksiyonunu açar belgesiz Meteor._wrapAsync fonksiyonunu sağladık eşzamanlı bir fonksiyona, yani mevcut Fiber geri çekilme geri dönene kadar verir ve Meteor.bindEnviro kullanır Geçerli Meteor ortam değişkenlerini (Meteor.userId()) gibi) korumanızı sağlamak için kullanın.

Basit kullanımı şu şekilde olacaktır:

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

Ayrıca asyncFunc sarmalanmış önce sağ bağlam denir emin olmak için function#bind kullanmak gerekebilir. Daha fazla bilgi için, bkz: https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

6

ben this gist yanıtını bulmak mümkün oldu. Bir method.call içinden asenkron kod çalıştırmak için, işlevinizi beklemeye zorlayan Futures'ı kullanırsınız.

var fut = new Future(); 
    asyncfunc(data, function(err, res){ 
     fut.ret(res); 
    }); 
    return fut.wait(); 
+0

Gelecek/vaat etmeyi önerecektim ama bunun Meteor'a yerleştirildiğini fark etmemiştim. Her yerde kullanışlıdır. – Dror

+1

Düz bir G'sin. Bu, çeþitli çeþitli seviye kodu burada – OneChillDude

+1

Futures artık Meteor çekirdeðinin bir parçasýdýr, bu yüzden artık çalýþmayacak. – iiz

0

Güncelleme: Üzgünüm, soruyu daha dikkatli okumalıydım. Bu soruyu sordu ve here yanıtladı.

Geleceğe bakacak olursak, düşünülmesi gereken başka bir örnek, senkronize olmayan çağrıdan dönen verilerle başka bir modeli güncellemek ve ardından bu modelin değişikliklerine abone olabilir.


meteor.call documentation itibaren sizin openSession işlevin çıktısını içermelidir geri arama işlevi sonucu argümanı (err, res) benziyor. Ancak, openSession işlevinizden herhangi bir değer döndürmüyorsunuz, böylece dönüş değeri tanımsızdır.

Bunu test edebilirsiniz:

Müşteri:

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

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

: Meteor

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