0

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

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

get()方法似乎遵循正确的承诺模式,但我无法让它发挥作用:

list([< string >path, ][< boolean >useCompression, ]< function >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()

返回错误:TypeError: this._pasv is not a function

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

这个 node-ftp 功能(以及类似的c.get())可以这样被承诺吗?还是我错过了什么?

4

1 回答 1

2

当您传递c.list给 时promisify,您希望它保留的调用上下文c(以便this实现的使用.list具有_pasv属性),所以使用.bind

var ftp_list = promisify(c.list.bind(c))
于 2020-02-22T05:12:52.680 回答