2012-11-02 4 views
8

비동기 함수 완료를 기다리는 클라이언트 method.call을 얻는 방법은 무엇입니까? 현재 함수의 끝에 도달하고 정의되지 않은 값을 반환합니다.동기 Meteor.methods 함수 내에서 MeteorJS 비동기 코드

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

클라이언트의 유성 메소드 내부에서 비동기 작업을 수행 할 수 없다고 생각합니다. 파이버를 사용하는 서버에서 옵션이 될 수 있습니다. – Andreas

답변

6

최신 버전의 표준 (err, res) 콜백 기능을 전환 문서화되지 않은 Meteor._wrapAsync 기능을 제공하고 있습니다 동기 함수로 변환합니다. 즉, 현재 Fiber가 콜백이 반환 될 때까지 yield하고 Meteor.bindEnviro 현재의 Meteor 환경 변수 (예 : Meteor.userId()))를 유지하는지 확인하십시오.

간단한 사용은 다음과 같은 것이다 :

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

는 또한 asyncFunc가 그것을 포장하기 전에 올바른 컨텍스트로 호출되어 있는지 확인 function#bind을 사용해야 할 수도 있습니다. 자세한 내용은 다음을 참조하십시오. https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

6

나는 this gist에서 답을 찾을 수 있었다. method.call 내에서 비동기 코드를 실행하려면 Futures를 사용하여 함수를 대기시킵니다.

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

미래/약속을 제안하려고했지만 유성에 내장되어 있다는 것을 깨닫지 못했습니다. 장소 곳곳에 유용합니다. – Dror

+1

당신은 똑바로 G입니다. 이것은 바로 여기 몇 발의 호출자 레벨 코드입니다 – OneChillDude

+1

선물은 더 이상 Meteor 코어의 일부가 아니므로 더 이상 작동하지 않습니다. – iiz

0

업데이트 : 죄송합니다. 더 자세히 질문을 읽었어야합니다. 이 질문은 또한 묻고 응답 한 것처럼 보입니다 here.

미래를 제외하고는 비동기 호출에서 반환 된 데이터로 다른 모델을 업데이트 한 다음 해당 모델의 변경 사항을 구독하는 것이 좋습니다.


meteor.call documentation에서 당신의 OpenSession에 함수의 출력을 포함해야 콜백 함수의 결과 인수 (err, res) 것 같습니다. 하지만 openSession 함수에서 값을 반환하지 않으므로 반환 값은 정의되지 않습니다.

이 작업을 테스트 할 수 있습니다

클라이언트 :

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

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

: 유성의

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