【问题标题】:WebSocket and javascript promises [duplicate]WebSocket 和 javascript 承诺 [重复]
【发布时间】:2016-03-09 09:19:11
【问题描述】:

尝试在 WebSocket api 之上实现一个 Promise 包装器。并在 chrome 上进行测试。

function WSConnection() {
    'use strict';
    this.socket = {};
}

WSConnection.prototype.connect = function (url) {
    'use strict';

    return new Promise(function (resolve, reject) {
        var this.socket = new WebSocket(url);

        this.socket.onopen = function () {
            socket.send('hello from the client');
            resolve();
        };

        this.socket.onmessage = function (message) {
            console.log("Received on websocket: " + message);
        };

        socket.onerror = function (error) {
            console.log('WebSocket error: ' + error);
            reject(error);
        };

        socket.onclose = function (event) {
            console.log("Websocket socket closed: " + JSON.stringify(event));
        };
    });
};


WSConnection.prototype.disconnect = function () {
    'use strict';
    console.log("Disconnect request from local app layer");
    this.socket.close();
};

但是当我运行它时,我得到了异常

        var this.socket = new WebSocket(url);

出现错误

“承诺拒绝时暂停。TyperError: 无法设置属性 'socket' 未定义”

。在控制台上我看到以下错误 -

“未捕获(承诺中)TypeError:无法设置属性'socket' 未定义”。

这里有什么问题? “this.socket”是指 Promise 对象中的 'socket' 变量吗?如果是这样,我如何访问 WSConnection 对象中的“套接字”变量。有没有更好的方法在浏览器上承诺 websocket api?

【问题讨论】:

  • 好吧,this 在 Promise 解析器回调中未定义。
  • 我从上面提供的duplicate link 获得了有用的信息。不知道如何接受。
  • 当您的问题结束时,您无需接受任何内容。您应该在那里为有用的答案投票。
  • 您可能还对websocket-as-promised 感兴趣 - 一个现成的基于 Promise 的 Websocket API。

标签: javascript websocket promise


【解决方案1】:

有错误的行的语法不正确

this.socket = new WebSocket(url);

我想应该是this.socket = new WebSocket(url);

同样在new Promise 回调中你的 this 将未定义,因为它是匿名回调。

你可以bind这个回调或ES2015箭头函数(更多细节here

箭头函数示例:

function WSConnection() {
    'use strict';
    this.socket = {};
}

WSConnection.prototype.connect = function (url) {
    'use strict';

    return new Promise((resolve, reject) => {
        this.socket = new WebSocket(url);

        this.socket.onopen = function () {
            socket.send('hello from the client');
            resolve();
        };

        this.socket.onmessage = function (message) {
            console.log("Received on websocket: " + message);
        };

        socket.onerror = function (error) {
            console.log('WebSocket error: ' + error);
            reject(error);
        };

        socket.onclose = function (event) {
            console.log("Websocket socket closed: " + JSON.stringify(event));
        };
    });
};


WSConnection.prototype.disconnect = function () {
    'use strict';
    console.log("Disconnect request from local app layer");
    this.socket.close();
};

【讨论】:

  • 感谢您指出问题。但是,我猜目前只有 Firefox 支持箭头功能
  • @shustfo 您可以使用转译器将其转换为 ES5(如 babel)
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2020-08-26
  • 2017-03-12
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多