9

REST API データを要求して (ライブラリー要求を使用して) データを取得するノード・スクリプトを作成しました。次のようないくつかの機能で構成されています。

var data = { /* object to store all data */ },
function getKloutData() {
  request(url, function() { /* store data */}
}
// and a function for twitter data

すべてをフェッチした後にいくつかのことをしたいので、ライブラリ async を使用してすべてのフェッチ関数を次のように実行しました。

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 が this コンテキストを変更するため、これは機能しません。私がそれを回避できる唯一の方法は、非同期とリクエストを介して渡すすべてをバインドすることです。

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);
};

私は何か基本的な間違ったことをしていますか?スクリプトに戻って child_processes にフォークすると、多くのオーバーヘッドが生じると思います。

4

3 に答える 3

9

あなたはそれを正確にやっています。

別の方法は、 を使用する代わりにオブジェクトへの参照を常にコンテキスト内に保持することです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');
    });
};
于 2012-07-11T09:01:47.373 に答える
3

これを別の変数に保存できます。

var me = this;

次にme、あなたthisです。

于 2012-07-11T09:00:07.290 に答える
0

この関数でオブジェクトをインスタンス化します:

function newClass(klass) {
    var obj = new klass;

    $.map(obj, function(value, key) {
        if (typeof  value == "function") {
            obj[key] = value.bind(obj);
        }
    });

    return obj;
}

これにより、すべての関数の自動バインディングが行われるため、オブジェクト内のメソッドがそのオブジェクトのコンテキストを持っている場合、習慣的な OOP スタイルでオブジェクトを取得できます。

したがって、次のものを介さずにオブジェクトをインスタンス化します。

var obj = new Fetcher();

しかし:

var obj = newClass(Fetcher);
于 2014-12-06T16:21:03.563 に答える