2016-11-03 2 views
1

Этот код сервера Meteor делает вызов DDP внешним сервисом serv2, и как только он получает результат, он должен отправить обратно клиенту, который совершил звонок, но это не так.Meteor DDP Обратный вызов в обратном вызове метода

Какое лучшее исправление? Должен ли я воспользоваться реактивной способностью MongoDB?

/////////////////////////// client/main.js \\\\\\\\\\\\\\\\\\\\\\\\\\ 

Template.hello.events({ 
    'click button'(event, instance) { 
    Meteor.call('service2', function (err, res) { 
     if (!err) { 
     console.log('got it'); //=> prints right away without waiting. 
     console.log(res);  //=> print undefined <================== 
     instance.msg.set(res); 
     } 
    }); 
    } 
}); 

/////////////////////////// server/app.js \\\\\\\\\\\\\\\\\\\\\\\\\\ 

import { Meteor } from 'meteor/meteor'; 
import { DDP } from 'meteor/ddp-client'; 

let serv2 = DDP.connect('localhost:7001'); 

Meteor.methods({ 
    'service2': function() { 
    serv2.call('service2', function (err, res) { 
     if (!err) { 
     console.log(res); //=> prints OK 
     return 'service 1 calling service 2 <br> + res'; //<====== failed to return. 
     } 
    }); 
    } 
}); 

ответ

2

Это то, что происходит:

  • Клиент называет service2 метод на сервере и ждет ответа DDP перед вызовом функции обратного вызова.

  • Сервер начинает работать функция service2, в которой ваша serv2.call()линия инициирует на .call() к вашему: 7001 сервер.

  • serv2.call() немедленно возвращается, так как вызов асинхронный.

  • Функция service2 теперь завершена и возвращает undefined, так как у нее нет оператора возврата.

  • Обратный вызов клиента получает этот результат и работает, как описано.

  • В некоторый более поздний момент вызова serv2 завершена, и это обратный вызов выполняется, но так как никто не слушает ее возвращаемое значение она теряется в пустоте ...

Для того, чтобы вам нужно выполнить настройку service2() wait at serv2.call(). Для этой цели существует метод Meteor.wrapAsync(). См. http://docs.meteor.com/api/core.html#Meteor-wrapAsync.

Вы также можете воспользоваться обсуждением здесь: Meteor: Proper use of Meteor.wrapAsync on server