2016-11-03 3 views
1

이 Meteor 서버 코드는 외부 서비스 serv2에 대한 DDP 호출을 만들고 일단 결과를 얻으면 호출 한 클라이언트로 다시 전송한다고 가정하지만 그렇지 않습니다.Method 콜백 내 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의 응답을 기다립니다. 7001 서버 :

  • 서버는 serv2.call() 라인 당신에 .call()를 시작하는 service2 기능을 실행하기 시작합니다.

  • serv2.call()은 호출이 비동기이기 때문에 즉시 반환됩니다.

  • 이제는 service2 함수가 완료되었으며 return 문이 없으므로 undefined을 반환합니다.

  • 클라이언트 콜백은이 결과를 얻고 설명한대로 실행됩니다. 일부 나중에에서

  • serv2에 대한 호출이 완료 될 때, 아무도는 무효에 손실 반환 값 듣고되지 않기 때문에이 콜백이 실행하지만 ...

만들려면 귀하의 설치 작업은 serv2.call()의 결과를 기다리는 service2()을 만들어야합니다. 이 목적을 위해 방법 Meteor.wrapAsync()이 존재합니다. http://docs.meteor.com/api/core.html#Meteor-wrapAsync을 참조하십시오.

여기에서 토론 할 수도 있습니다. Meteor: Proper use of Meteor.wrapAsync on server