meteor.js - 如何检查来自异步回调的值

Posted

技术标签:

【中文标题】meteor.js - 如何检查来自异步回调的值【英文标题】:meteor.js - how to check values from asynchronous callback 【发布时间】:2016-04-11 06:58:21 【问题描述】:

上下文

我正在进行调用,如果成功,则将布尔值从 false 更改为 true。然后,在这个调用之外,我检查这个布尔值是否为真,如果是,我路由到另一个页面。

问题

控制台日志表明,在调用有时间更改布尔值之前,正在执行检查布尔值的 if 语句。我意识到这是因为异步性,但不确定正确的设计模式是什么。这是一个sn-p:

     //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 有关,但不太清楚如何实际使用它。

【问题讨论】:

有什么原因不能将 Meteor.call('updateEvent') 回调之外的代码块移动到回调中?你可以使用类似 wrapAsync 的东西,或者使用下面建议的会话变量,但为什么不把它放到回调中呢? 其实有...原因是我其实有三个回调函数,if语句检查三个是否都是真的。 【参考方案1】:

由于条件是在回调返回值之前运行的,因此您需要一个位于响应式运行的函数内部的条件。我使用了以下代码:

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

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

【讨论】:

【参考方案2】:

不。问题是因为它是一个异步函数,所以:

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

【讨论】:

这实际上不起作用,不知道为什么。我还尝试将Session.get 直接放在if 条件中(因为会话获取可能是反应性的,但它放入的变量不是)......这仍然不起作用。请参阅我的答案以了解实际有效的方法。

以上是关于meteor.js - 如何检查来自异步回调的值的主要内容,如果未能解决你的问题,请参考以下文章

nodejs如何从异步回调函数返回想要的值

如何在外面引用js中ajax回调函数中的值

如何在 onError 回调中使用异步错误处理程序?

MeteorJS:模板助手更新后的回调

Node.js - 如何使用回调调用异步函数?

Pybind11:为啥来自 Python 的异步调用不能在 C++ 中正确执行回调?