Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript meteor.js-如何检查异步回调中的值_Javascript_Node.js_Asynchronous_Meteor_Callback - Fatal编程技术网

Javascript meteor.js-如何检查异步回调中的值

Javascript meteor.js-如何检查异步回调中的值,javascript,node.js,asynchronous,meteor,callback,Javascript,Node.js,Asynchronous,Meteor,Callback,上下文 我正在做一个调用,如果成功,将布尔值从false更改为true。然后,在这个调用之外,我检查这个布尔值是否为真,如果为真,我将路由到另一个页面 问题 控制台日志表明,在调用有时间更改布尔值之前,正在执行检查布尔值的if语句。我意识到这是因为异步性,但不确定正确的设计模式是什么。以下是一个片段: //set variables to check if the even and user get updated or if error var eventUpdated =

上下文

我正在做一个调用,如果成功,将布尔值从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语句执行,直到回调返回一个值。基于谷歌搜索,我认为这与如何实际使用它有关,但不太清楚。

不。问题在于,由于它是一个异步函数,因此:

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是一个被动变量,您应该正确获取当前值。

由于条件是在回调返回值之前运行的,因此您需要一个在被动运行的函数中的条件。我使用了以下代码:

    Tracker.autorun(function(){
        if (Session.get('userUpdated') && Session.get('passwordUpdated') && Session.get('eventUpdated')) {
            Router.go('/get-started/confirmation');
        }
    });

您可以阅读更多有关Meteor反应性的信息。

有什么原因不能将Meteor.call('updateEvent')回调之外的代码块移动到回调中吗?你可以使用像wrapAsync这样的东西,或者使用下面建议的会话变量,但是为什么不把它放到回调中呢?实际上有。。。原因是我实际上有三个回调函数,
if
语句检查这三个函数是否都为真。这实际上不起作用,不知道为什么。我还尝试将
会话.get直接放在
if
条件中(因为会话get可能是被动的,但它放入的变量不是)。。。这仍然不起作用。请看我的答案,了解实际起作用的是什么。