Не могу обещать функцию узла ftp - PullRequest
0 голосов
/ 22 февраля 2020

Я использую библиотеку node-ftp , и я хотел бы обещать определенные методы (list() и get()).

Я знаю, что существуют обещания обертки, но мне нужно вернуть читаемый поток (а не записать в локальный файл), и узел-ftp позволяет это.

метод get(), кажется, следует правильному шаблону для обещания, но я не могу получить чтобы это работало:

список ([ путь,] [ useCompression,] <функция> обратный вызов)

непроизведенный код работает должным образом

// 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. ошибка заставляет меня думать, что это проблема со стрелкой, но использование обычной функции тоже не сработало.

Может ли эта функция узла ftp (а также c.get()) быть таким образом обещанной? Или я что-то упустил?

1 Ответ

0 голосов
/ 22 февраля 2020

Когда вы передаете c.list в promisify, вы хотите, чтобы сохранял контекст вызова c (чтобы this, используемый реализацией .list, имел _pasv свойство), поэтому используйте .bind:

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