【问题标题】:How do I use RSVP deferreds with WebSocket?如何将 RSVP 延迟与 WebSocket 一起使用?
【发布时间】:2015-08-14 22:35:57
【问题描述】:

我需要同时打开多个WebSocket 连接,然后在打开所有连接后执行操作。

我正在使用 RSVP.js 的 defer()all()then() 方法。但是,then()catch() 都没有被触发,我无法弄清楚我哪里出错了。

这是我的代码:

var numberOfThreads = 6,
    openSockets = function () {
        var // the deferred object
            d,
            // array of promises
            socketsOpened = [],
            // websocket object and index
            ws, i;

        // open a new WebSocket connection for each iteration
        for (i = 0; i < numberOfThreads; i += 1) {
            // create deferred object
            d = RSVP.defer();

            // push promise into array
            socketsOpened.push(d.promise);

            // create websocket connection to valid, working socket server
            ws = new WebSocket(url);

            // websocket events
            ws.onopen = function () {
                // when socket is open, resolve deferred
                d.resolve();
            };
        }

        // when all connections are open, do stuff
        RSVP
        .all(socketsOpened)
        .then(function () {
            console.log('All sockets are opened!');
        }).catch(function () {
            console.log('Oops! Something has gone wrong!');
        });
    };

openSockets();

我做错了什么?

【问题讨论】:

    标签: javascript websocket deferred rsvp.js


    【解决方案1】:

    我应该创建一个数组(d = []),而不是将deferred 分配给d,将每个deferred 分配给数组的i 位置(d[i] = RSVP.defer()),然后推送@987654327 @ 进入socketsOpened 数组。

    这是新代码:

    var numberOfThreads = 6,
        openSockets = function () {
            var // an array for deferred objects
                d = [],
                // array of promises
                socketsOpened = [],
                // websocket object and index
                ws, i;
    
            // open a new WebSocket connection for each iteration
            for (i = 0; i < numberOfThreads; i += 1) {
                // protect i with closure
                (function (i) {
                    // create deferred object
                    d[i] = RSVP.defer();
    
                    // push promise into array
                    socketsOpened.push(d[i].promise);
    
                    // create websocket connection to valid, working socket server
                    ws = new WebSocket(url);
    
                    // websocket events
                    ws.onopen = function () {
                        // when socket is open, resolve deferred
                        d[i].resolve();
                    };
                }(i));
            }
    
            // when all connections are open, do stuff
            RSVP
            .all(socketsOpened)
            .then(function () {
                console.log('All sockets are opened!');
            }).catch(function () {
                console.log('Oops! Something has gone wrong!');
            });
        };
    
    openSockets();
    

    抱歉浪费了大家的时间!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 2021-09-16
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多