2016-06-16 1 views
1

Meteor 프로젝트에서 작업 중이며 Meteor.call의 반환 값을 클라이언트 측의 템플릿 도우미에서 가져오고 싶습니다. 맨 처음 콜백 함수에서 변수를 설정하고 Meteor.call 외부에서 변수의 값을 가져옵니다. Meteor.call 코드가 전혀 실행되지 않으면 코드를 발견했습니다. 그런 다음 조금 검색하여 Session을 사용하면됩니다. 그러나 나는 그 이유를 정말로 모른다. 여기 내 원래 코드와 수정 된 코드가 있습니다. 아무도 나를 위해 조금 설명 할 수 있습니까? 감사!!클라이언트 측 비동기 Meteor.call을 이해하는 방법

원래 잘못된 코드 : HTML

<div id="text-result-main"> 
    <h2>{{title}}</h2> 
</div> 

JS

Template.texts.helpers({ 
    title: function(){ 
    var index = Router.current().params.index; 
    Meteor.call('getTitle', index,function(error, result){ 
     titles = result; 
    }); 
    console.log(titles); 
    return titles; 
}}); 

컬렉션 text.js

Text = new Mongo.Collection("text"); 
Meteor.methods({ 
    'getTitle': function(myindex){ 
    return Text.findOne({index: myindex}).title; 
    }}); 

작업 코드 : JS

Template.texts.helpers({ 
title: function(){ 
     var index = Router.current().params.index; 
     Meteor.call('getTitle', index,function(error, result){ 
     Session.set("titles",result); 
     }); 
     console.log(Session.get("titles")); 
    return Session.get("titles"); 
}}); 

클라이언트에 콜렉션 텍스트를 게시하지 않았다는 것에 주목하십시오. 잘못된 코드를 실행할 때 페이지를 새로 고칠 때마다 "제목"의 내용을 보거나 콘솔에서 볼 수 없습니다. 그러나 세션을 설정하면 작동합니다. 나는 그것이 어떻게 여기에서 작동하는지 정말로 모른다. 감사합니다

답변

1

는 반응성

이 허식 비 동시성 및 두 가지 문제 있습니다

title: function(){ 
    var index = Router.current().params.index; 
    var a = Text.findOne({index: myindex}).title; 
    console.log(a); 
    return a; 

방법이없는을

Meteor.call('getTitle', index,function(error, result){ 
    titles = result; 
}); 
유성 호출 내의

은 실행되지만 비동기식으로 실행됩니다. 따라서 도우미가 돌아 오면 바로 호출되어 빈 값을 반환합니다.

브라우저의 콘솔에서 사용해보십시오.

하지만 세션 변수를 사용할 때 템플릿이 {{title}}에서 올바르게 렌더링되는 이유는 무엇입니까? 세션은 반응적인 데이터 소스이기 때문에 마녀는 모든 데이터 변경이이 데이터와 관련된 모든 템플릿의 재 계산을 트리거한다는 것을 의미합니다. 변수는

  • 경우 변수 값을 설정,

    • 방법

    • 방법이 실행

    • 반환 빈 값라고 : 여기

      타임 라인입니다 반응 형 데이터 소스 인 템플릿이 다시 계산됩니다. (귀하의 경우 세션은 반응적인 데이터 소스입니다.)

    는 세션 변수에서 아주 가까이, 나는 그 경우 반응성 VAR을 사용

    더 나아가,하지만 범위는 템플릿으로 제한됩니다.

    반응성 데이터 소스에 좋은 읽기 : http://richsilv.github.io/meteor/meteor-reactive-data-types/

  • 0

    왜 이런 걸 사용하지 :

    +0

    더 많은 정보가 없으면 메소드 호출이 필수는 아닙니다. –

    +0

    내 컬렉션이 너무 커서 클라이언트에 클라이언트를 퍼블리싱하면 성능이 견딜 수 없기 때문입니다. 아직도 제안을 주셔서 감사합니다 – yiyizheliu

    +0

    mongodb.Partial 인덱스에 대한 부분 인덱스를 사용해보십시오. 지정된 필터 표현식을 만족하는 컬렉션의 문서 만 색인화합니다. 따라서 컬렉션의 하위 집합 만 게시하게됩니다. – AGdev

    1

    문제 콜백와 결합 할 때 Meteor.call() 비동기 있다는 사실이다.

    따라서 title()이 실행되기 시작하면 사용자의 Meteor.call() 호출이 결과 (또는 오류)를 반환 할 때까지 기다리지 않습니다. 실행을 계속합니다. 이를 비동기 실행이라고합니다.

    간단히 말해, 의 키 값은 Session에 존재하지 않습니다 (이 시점에서 비동기 유티 콜 상태는 알 수 없으므로).

    Meteor.call()과 페어링 된 콜백으로 콘솔 로그 명령문을 이동하면 Session에 성공적으로 설정 한 결과를 볼 수 있습니다.


    문제에 대한 해결 방법은 다음과 같이 당신의 Meteor.call() 동기를 확인하는 것입니다 : 콜백은 동 기적으로 작동 Meteor.call()하게 제거

    Template.texts.helpers({ 
    title: function(){ 
         var index = Router.current().params.index; 
         var result = Meteor.call('getTitle', index); // <--- this is synchronous code now 
         Session.set("titles",result); 
         console.log(Session.get("titles")); 
         return Session.get("titles"); 
    }}); 
    

    .

    서버에서 콜백을 전달하지 않으면 메소드가 완료 될 때까지 메소드 호출 이 차단됩니다. 결국 메서드의 반환 값을 반환하거나 메서드가 예외를 throw하면 예외가 throw됩니다.

    단지 synchrnous 하나에`Meteor.call` 변환 당신이 (당신이, 내가 말할 수있는 것) 비동기 호출에 문제가있는 경우

    +0

    안녕하세요. 이것은 실제로 내 코드에서 작동하지 않습니다. 비동기 호출 만 사용하고 그 안에 세션을 설정할 수 있습니다. – yiyizheliu

    +0

    다른 방법으로 제안 된 코드 스 니펫. Meteor IIRC에서는 클라이언트 쪽 세션'sets'과'gets'가 허용됩니다. – Quirk

    관련 문제