CONTEXT
我正在进行调用,如果成功,则将布尔值从false更改为true。然后,在这个调用之外,我检查这个布尔值是否为真,如果是,我将路由到另一个页面。
问题
控制台日志表明在调用有时间更改布尔值之前,正在执行检查布尔值的if语句。我意识到这是因为异步性,但不确定这个的正确设计模式是什么。这是一个片段:
//set variables to check if the even and user get updated or if error
var eventUpdated = false;
Meteor.call('updateEvent', eventId, eventParams, function(error, result){
if(error){
toastr.error(error.reason)
} else {
var venueId = result;
toastr.success('Event Info Updated');
eventUpdated = true;
console.log(eventUpdated)
}
});
console.log(eventUpdated)
if (eventUpdated) {
Router.go('/get-started/confirmation');
}
可能的解决方案
我猜我需要一种方法来保持if语句的执行,直到回调返回一个值。基于谷歌搜索,我认为这与this有关,但对如何实际使用它并不太清楚。
答案 0 :(得分:2)
由于条件在回调返回值之前运行,因此您需要一个在响应式运行的函数内的条件。我使用了以下代码:
Tracker.autorun(function(){
if (Session.get('userUpdated') && Session.get('passwordUpdated') && Session.get('eventUpdated')) {
Router.go('/get-started/confirmation');
}
});
您可以阅读有关流星反应性的更多信息here。
答案 1 :(得分:1)
不。问题在于,因为它是异步函数,所以:
console.log(eventUpdated)
if (eventUpdated) {
Router.go('/get-started/confirmation');
}
在实际通话前运行。在调用中使用Session.set,如下所示:
Session.set("eventUpdated", "true");
然后在外面:
eventUpdated = Session.get("eventUpdated");
console.log(eventUpdated)
if (eventUpdated) {
Router.go('/get-started/confirmation');
}
由于Session是一个反应变量,你应该正确获得当前值。