Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何解决';这';节点库(如async和request)存在问题_Node.js_This_Libraries - Fatal编程技术网

Node.js 如何解决';这';节点库(如async和request)存在问题

Node.js 如何解决';这';节点库(如async和request)存在问题,node.js,this,libraries,Node.js,This,Libraries,我编写了一个节点脚本,它通过请求RESTAPI数据(使用库请求)获取一些数据。它由以下两个函数组成: var data = { /* object to store all data */ }, function getKloutData() { request(url, function() { /* store data */} } // and a function for twitter data async.parallel([ getTwitterData, getKloutD

我编写了一个节点脚本,它通过请求RESTAPI数据(使用库请求)获取一些数据。它由以下两个函数组成:

var data = { /* object to store all data */ },
function getKloutData() {
  request(url, function() { /* store data */}
}
// and a function for twitter data
async.parallel([ getTwitterData, getKloutData ], function() {
    console.log('done');
});
因为我想在获取所有数据之后做一些事情,所以我使用库异步运行所有的获取函数,如下所示:

var data = { /* object to store all data */ },
function getKloutData() {
  request(url, function() { /* store data */}
}
// and a function for twitter data
async.parallel([ getTwitterData, getKloutData ], function() {
    console.log('done');
});
这一切都很好,但我希望将所有内容都放在对象模式中,以便可以同时获取多个帐户:

function Fetcher(name) { 
    this.userID = ''
    this.user = { /* data */ }
    this.init();
}
Fetcher.prototype.init = function() {
    async.parallel([ this.getTwitterData, this.getKloutData ], function() {
        console.log('done');
    });
}
Fetcher.prototype.getKloutData = function(callback) {
    request(url, function () { /* store data */ });
};
这不起作用,因为async和request更改了此上下文。我唯一可以绕过它的方法是绑定我通过异步和请求传递的所有内容:

Fetcher.prototype.init = function() {
    async.parallel([ this.getTwitterData.bind(this), this.getKloutData.bind(this) ], function() {
        console.log('done');
    });
}
Fetcher.prototype.getKloutData = function(callback) {
    function saveData() {
        /* store data */
    }


    request(url, saveData.bind(this);
};

我是做错什么了还是怎么了?我认为还原到脚本并将其分给子进程会产生很大的开销。

您可以将其保存到另一个变量中:

var me = this;

那么
me
就是你的
这个

你做得完全正确

另一种方法是始终在上下文中保留对对象的引用,而不是使用
bind
,但这需要一些技巧:

Fetcher.prototype.init = function() {
    var self = this;
    async.parallel([
        function(){ return self.getTwitterData() },
        function(){ return self.getKloutData() }
    ], function() {
        console.log('done');
    });
}

Fetcher.prototype.getKloutData = function(callback) {
    var self = this;

    function saveData() {
        // store data
        self.blah();
    }

    request(url, saveData);
};
您也可以事先进行绑定:

Fetcher.prototype.bindAll = function(){
    this.getKloutData = this.prototype.getKloutData.bind(this);
    this.getTwitterData = this.prototype.getTwitterData.bind(this);
};

Fetcher.prototype.init = function(){
    this.bindAll();
    async.parallel([ this.getTwitterData, this.getKloutData ], function() {
        console.log('done');
    });
};

使用此函数实例化对象:

函数新类(klass){
var obj=新的klass;
$.map(对象,函数(值,键){
如果(值的类型==“函数”){
obj[key]=value.bind(obj);
}
});
返回obj;
}
这将自动绑定所有函数,因此您将以习惯的OOP样式获取对象, 当对象中的方法具有其对象的上下文时

因此,您不通过以下方式实例化对象:

var obj = new Fetcher();
但是:


下划线库有一个名为
bindAll
的简便函数,可以减少这种操作的痛苦。如果你选择CoffeeScript,你可以用fat箭头定义方法,而不必做任何显式绑定。我最初的问题是在一个没有jQuery的nodejs环境中。下划线和lodash中的
bindAll
方法(libs在所有JS环境中工作)也是为您设计的。