2016-02-24 5 views
0

Я новичок в метеор и у меня есть метод в Meteor.methods как:Метеор метод асинхронной вызов

sendStory(story) { 

    HTTP.call("GET", "https://offline-news-api.herokuapp.com/stories", function(error, response){ 
     if(error){ 
     console.log("error") 
     }else{ 
     console.log(response) 
     var story = story 
     return story 
     } 
    }) 
    } 

, а затем я звоню это на моем cliet как:

Meteor.call('sendStory', this.story, function(res){ 
     console.log("some story") 
     console.log(res) 
     }) 

Вот он не печатая res значение оно дает undefined и вызов апи производится в последний ..

Как я могу сделать апи вызов первым, а затем перейти к callback сюда м апи

Спасибо ..

ответ

1

Ну,

не используют обратный вызов для HTTP вызова, как это:

sendStory(story) { 
var story = HTTP.call("GET", "https://offline-news-api.herokuapp.com/stories"); 
return story; 
} 

относятся здесь к Meteor Docs

Вы не можете вернуться из обратный вызов, поскольку методы Meteor работают внутри волокон.

0

Вы можете использовать будущее:

sendStory(story) { 

    Future = Npm.require('fibers/future'); 
    var apiFuture = new Future(); 

    HTTP.call("GET", "https://offline-news-api.herokuapp.com/stories", function(error, response){ 
     if(error){ 
      console.error("Error: ", error); 
      apiFuture.throw(error); 
     }else{ 
      console.log("Response: ", response); 
      apiFuture.return(response); 
     } 
    }); 

    return apiFuture.wait(); 
} 

и на клиенте:

Meteor.call('sendStory', this.story, function(err, res){ 
    console.log("some story"); 
    if (err) { 
     console.error(err); 
    } else { 
     console.log("Great! A response from the API: ", res); 
    } 
}); 
0

Как guns упоминалось, вы возвращаете неопределенные от метода сервера. Этот метод не ожидает завершения асинхронной функции. Вместо этого он возвращается.

На сервере я всегда использую синхронный подход.

Смежные вопросы