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'"
我不确定这段代码有什么问题.有谁知道这有什么问题?你能指点我调试/排除错误信息的原因吗?
谢谢.
当你通过
ftpClient.list
Run Code Online (Sandbox Code Playgroud)
对Q.denodefiy,你所得到的函数对象,list从ftpClient对象.它只是一个功能,与父母的关系就会丢失.这很重要,因为绑定函数list可能依赖于ftpClient对象.因此,您必须确保链接没有被破坏.
请注意,如果您有一个使用Node.js回调模式的方法,而不仅仅是一个函数,则需要在将其传递给denodeify之前将其绑定,如下所示:
Run Code Online (Sandbox Code Playgroud)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));
Run Code Online (Sandbox Code Playgroud)使用Q.nbind,这样
var ftpList = q.nbind(ftpClient.list, ftpClient);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1091 次 |
| 最近记录: |