我是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();
但是,当使用节点运行该代码时,它会显示错误" list error:TypeError:Object#没有方法' _pasv'"
我不确定这段代码有什么问题。有谁知道这有什么问题?你能指点我一些方法来调试/排除错误信息的原因吗?
感谢。
答案 0 :(得分:7)
传递
时ftpClient.list
到Q.denodefiy
,您将从list
对象获取函数对象ftpClient
。它只是一个功能,与父母的关系就会丢失。这很重要,因为绑定函数list
可能依赖于ftpClient
对象。因此,您必须确保链接没有被破坏。
请注意,如果您使用Node.js回调模式的 方法 , 与仅仅是一个函数相比,您需要绑定它的这个值 在将它传递给denodeify之前,就像这样:
var Kitty = mongoose.model("Kitty"); var findKitties = Q.denodeify(Kitty.find.bind(Kitty));
更好的方法策略是使用
Q.nbind
,如下所示。
因此,您可以通过两种方式修复代码,
使用Q.denodeify
和Function.prototype.bind
,就像这样
var ftpList = q.denodeify(ftpClient.list.bind(ftpClient));
使用Q.nbind
,就像这样
var ftpList = q.nbind(ftpClient.list, ftpClient);
答案 1 :(得分:1)
您需要使用q.nbind
q.nbind(ftpClient.list, ftpClient);