无法对node-ftp模块中的方法进行去除

use*_*929 1 javascript node.js promise

我是node.js和promise样式函数调用的新手.通过查看http://runnable.com/Ulatc0QnzUgUAAAK/adapting-node-js-with-q-for-promises上的denodeify示例,我试图将node.js node-ftp模块的方法去除如下:

var ftp = require('ftp');
var q = require('q');
var ftpClient = new ftp();
ftpClient.on('ready', function() {
    var ftpList = q.denodeify(ftpClient.list);
    ftpList().then(function(list) {
        console.log(list);
    }.then(null, function(err) {
        console.log(err);
    }).done(function() {
        ftpClient.end();
    });
});
ftpClient.connect();
Run Code Online (Sandbox Code Playgroud)

但是,当使用节点运行该代码时,它会显示错误"list error:TypeError:Object#have method'apasv'"

我不确定这段代码有什么问题.有谁知道这有什么问题?你能指点我调试/排除错误信息的原因吗?

谢谢.

the*_*eye 7

当你通过

ftpClient.list
Run Code Online (Sandbox Code Playgroud)

Q.denodefiy,你所得到的函数对象,listftpClient对象.它只是一个功能,与父母的关系就会丢失.这很重要,因为绑定函数list可能依赖于ftpClient对象.因此,您必须确保链接没有被破坏.

引用Q.denodeify文档,

请注意,如果您有一个使用Node.js回调模式的方法,而不仅仅是一个函数,则需要在将其传递给denodeify之前将其绑定,如下所示:

var Kitty = mongoose.model("Kitty");
var findKitties = Q.denodeify(Kitty.find.bind(Kitty));
Run Code Online (Sandbox Code Playgroud)

方法的更好策略是使用Q.nbind,如下所示.

那么,您可以通过两种方式修复代码,

  1. 使用Q.denodeifyFunction.prototype.bind,像这样

    var ftpList = q.denodeify(ftpClient.list.bind(ftpClient));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用Q.nbind,这样

    var ftpList = q.nbind(ftpClient.list, ftpClient);
    
    Run Code Online (Sandbox Code Playgroud)