无法承诺 node-ftp 函数

Can't Promisify node-ftp Function

我正在使用 node-ftp 库,我想承诺某些方法(list()get())。

我知道有基于 promise 的包装器,但我需要 return 可读流(而不是写入本地文件)并且 node-ftp 允许这样做。

get() 方法似乎遵循正确的 promisification 模式,但我无法让它工作:

list([path, ][useCompression, ]callback)

非承诺代码按预期工作

// THIS WORKS

var Client = require('ftp');

var c = new Client();

c.on('ready', function () {
  c.list('/mypath', function (err, data) {
    console.log(data)
  })
});
c.connect()

..承诺代码不:

// THIS DOES NOT WORK

var Client = require('ftp');
var { promisify } = require('util');

var c = new Client();

var ftp_list = promisify(c.list)

c.on('ready', function () {

  ftp_list('/mypath')
      .then(data => {
        console.log(data)
      })      
      .catch((err) => {
        console.log('Error', err);
      });    

});
c.connect()

returns 错误:TypeError: this._pasv is not a function

错误中 this. 的存在让我认为这是一个箭头函数问题,但使用普通函数也不起作用。

这个 node-ftp 函数(以及同样的 c.get())可以这样被承诺吗?还是我遗漏了什么?

当您将 c.list 传递给 promisify 时,您希望它 保持 c 的调用上下文(以便 [= .list 的实现使用的 14=] 有 _pasv 属性), 所以使用 .bind:

var ftp_list = promisify(c.list.bind(c))