2016-10-14 5 views
0

내 Meteor js 앱에서 매우 흥미로운 문제가 있습니다. 템플릿의 onCreated 메서드 내에서 유성 메서드를 호출 할 때 해당 메서드 호출에 대한 콜백은 때때로 undefined로 즉시 반환됩니다. 결과. 유성우 시뮬레이션을 실행 한 결과 템플릿이 생성 되었기 때문입니다.유성 메서드 시뮬레이션 외부에서 코드를 실행하는 방법

두 질문 :

  1. 인가

    이 버그? 확실히 내가 예상했던 행동이 아닙니다.
  2. setTimeout과 같은 이상한 해킹을 사용하지 않고 어떻게 해결할 수 있습니까? (그런데 Meteor.setTimeout은 메소드 시뮬레이션 내부에서 허용되지 않습니다)?

일부 코드 :

// My Template (Not my real code, just to demonstrate) 
Template.saying.onCreated(() => { 
    var tmpl = Template.instance(); 
    tmpl.saying = new ReactiveVar(); 

    Meteor.call('getSaying', (err, saying) => { 
    // If called inside of a simulation, saying is null 
    tmpl.saying.set(saying); 
    }); 
}); 


// Assume that the above template is used in an {{each}} block 
// and somewhere in my code I call this 
Items.insert({}); 

// Because Items.insert wraps a meteor method which also runs as a 
// simulation on the client, then the Template.saying.onCreated 
// callback will be called in the context of an active simulation, 
// which means that 'getSaying' method call will return immediately 
// with undefined as the result. 
+1

로 평가됩니다 실행하면 - 당신은 서버에게 부모 템플릿이 단지에 렌더링 될 때마다 루프에서 1 회/템플릿을 호출 할거야 반응 변수를 설정하십시오. 이 작품을 만들더라도 느려질 것입니다. 서버에서 가져온 데이터를 콜렉션에 넣고 Meteor가 클라이언트에 전달하도록하십시오. –

+0

불행히도 내가 사용해야하는 패턴이 있습니다. 각 템플릿에는 자체 토큰이 필요하며, 토큰은 즉석에서 생성되어야합니다. – cwohlman

답변

0

두 가지 가능성이 시뮬레이션을 피하기 위해 :

  1. 사용 isClient 파일 서버 측에서 방법을 정의합니다. 시뮬레이션이 사실

    이 꽤 비효율적 인 패턴 같은 느낌
    if (Meteor.isClient) { 
    // on the client, the return value of a stub is ignored 
    return; 
    } 
    
+0

실제로이 두 가지 이유로 작동하지 않습니다 : 1. 내가 얻는 동작은 서버 쪽에서 만 정의 된 메서드입니다 (그러나 외부 메서드는 클라이언트와 서버 쪽 모두로 정의되며 그 방법이어야 함) . 2. 문제는 상황 (시뮬레이션 내부)에서 반환 값이 무시되지는 않지만 원하는 결과입니다. – cwohlman

+0

글쎄, 위의 코드에서 값이 어떻게 무시되지 않는지 알지 못합니다. 어떻게 확신하니? 만약 시뮬레이션이라면 조건은 사실로 평가 될 것입니다. – hlx

+0

유성 메소드가 유성 메소드 시뮬레이션 내부에서 호출 된 경우 위 예제에서와 같이 정의되지 않은 반환 값이 유성 메소드 콜백에 ​​전달되는 것이 문제입니다. – cwohlman