【问题标题】:How to convert callback code into promise format?如何将回调代码转换为 Promise 格式?
【发布时间】:2020-02-05 08:36:05
【问题描述】:

我手动成功地通过端口2345 远程登录到linux345。 这意味着以下代码应将输出显示为0

但是,代码输出返回1。 似乎将callback 转换为async promise 格式将有助于解决问题。 请建议更新后的代码是什么样的。

const net = require('net');

const HOST = 'linux345';
const PORT = 2345;
let ErrCode = 1;

const client = new net.Socket();

client.connect(PORT, HOST, function() {
    ErrCode = 0;
});

client.on('data', function(data) {    
    console.log('Client received: ' + data);
     if (data.toString().endsWith('exit')) {
       client.destroy();
    }
});

client.on('close', function() {
});

client.on('error', function(err) {
    ErrCode = err.code;
    console.log(ErrCode);
});

console.log(ErrCode);

【问题讨论】:

  • 或者...您可以将最后一个 console.log() 移动到有意义的回调函数中
  • 我需要在代码的其他地方使用ErrCode 的值。因此,可能需要将其转换为 async promise 格式
  • 转换什么,究竟是什么?您有四个异步事件处理程序,其中一个 (data) 连续触发。您认为“将callback 转换为async promise 格式” 会在这里做什么?
  • 我能看到的唯一适合你的模式是 async generator 包装 data 事件回调

标签: javascript node.js promise async-await angular-promise


【解决方案1】:
let ErrCode = 1;

const client = new net.Socket();

const connect = util.promisify(client.connect);

async function testFun() {
    try {
        let data = await connect(PORT, HOST);
        ErrCode = 0;
        console.log('Client received: ' + data);
        if (data.toString().endsWith('exit')) {
            client.destroy();
        }
    }
    catch (ex) {
        ErrCode = -1;
    }
}

testFun().then(() => {
    console.log(ErrCode)
}
)

使用util.promisify

采用常见的错误优先回调样式的函数,即 将 (err, value) => ... 回调作为最后一个参数,并且 返回一个返回承诺的版本。

【讨论】:

  • 谢谢 Sudhakar。我无法采用错误优先的回调方式。你能提供更新的代码吗?
  • @meallhour 您想将哪个电话转换为承诺?
  • 我需要帮助才能获得ErrCode 的正确值,最后是0
  • @meallhour 如果您遇到任何问题,请查看我的更新答案并发表评论
  • 我得到-1 作为输出,即使它成功建立了 telnet 连接。
猜你喜欢
  • 2016-12-20
  • 2015-12-11
  • 1970-01-01
  • 2018-04-23
  • 2018-09-19
  • 2015-10-24
  • 2013-06-16
  • 2017-03-22
相关资源
最近更新 更多