【问题标题】:Waiting for multiple WebSocket callbacks等待多个 WebSocket 回调
【发布时间】:2017-12-15 05:34:47
【问题描述】:

我正在使用多个 WebSocket 查询来初始化一个页面(我通过 onmessage 事件接收结果,然后为收到的每条消息调用正确的回调函数)。

即:

query("get_users",callback1);
query("get_weather",callback2);
...

现在我想显示一个加载器(微调器)并使其仅在加载所有数据后才消失(所有回调都已完成)。我知道我可以让回调更新一个计数器,但如果可能的话,我正在寻找一种更优雅的方式来做到这一点。

我尝试使用 JQuery Promises,但不明白如何将它与 WebSockets(而不是 Ajax 调用)一起使用。

请帮忙。

【问题讨论】:

    标签: javascript jquery websocket callback promise


    【解决方案1】:

    答应它:

    function request(url){
     return new Promise(function(resolve){
       query(url,resolve);
     });
    }
    

    然后你可以使用 Promise.all:

    Promise.all([request("get_users"),request("get_weather")])
     .then(function([users,weather]){
       console.log(users,weather);
    });
    

    如果您想分离数据处理程序和微调器,只需使 Promises 全局可用:

    var users=request("get_users"),
      weather=request("get_weather");
    
    weather.then(function(weather){
      //show weather
    });
    //same with users
    
    loader.show();//show some spinner
    Promise.all([weather,users]).then(loader.hide);//hide if all loaded
    

    【讨论】:

    • 如果查询是从不同的文件发起的呢? (即:一个文件查询用户并处理结果,另一个文件查询天气等...)
    • @OmriSoudry 将承诺暴露给全局变量,例如变种天气=请求(“get_weather”); ,那么你就可以把它放到 Promise.all 各处...
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多