1

すばらしいasync モジュールを使用して、NodeJS 用の素敵な Javascript コードを書きたいと思います。値の配列があり、各値に対して特定の関数を呼び出して、結果を配列に蓄積したいと考えています。これには async.map を使用します。残念ながら、呼び出そうとする関数が自分のクラスのプロトタイプ関数である場合、変数値の読み取りに失敗します。

これは私が定義したテスト「クラス」です。

var async = require('async');

function ClassA() {
    this.someVar = 367;
};

ClassA.prototype.test1 = function(param, callback) {
    console.log('[' + param + ']The value in test is: ' + this.someVar);
    callback(null, param + this.someVar);
};

ClassA.prototype.test2 = function() {
    var self = this;

    async.map([1,3,4,5], (self.test1), function(err, result){
        if (err) {
            console.log('there was an error')
        } else {
            console.log('Result is: ' + result)
        }
    })
};

module.exports = new ClassA();

そして、これが私がそれを使用する方法です

testclass.test1(1, function(err, data){});
testclass.test2();

それが出力です:

[1]The value in test is: 367
[1]The value in test is: undefined
[3]The value in test is: undefined
[4]The value in test is: undefined
[5]The value in test is: undefined
Result is: NaN,NaN,NaN,NaN

test2得られた出力を見るとわかるように、変数async.mapにアクセスできません。this.someVar

質問 ここで間違いなく何かが欠けています。誰かが私にエラーを指摘して、それが機能しない理由を説明できますか? 未定義の代わりに 367 が表示されると思います。問題はこの SO questionに関連していると思いますが、ユースケースの解決策が見つからないようです。

読んでくれてありがとう。質問が長くなってすみません!

4

1 に答える 1

3

私はそのライブラリの専門家ではありません (実際、使用したことはありません)。

しかし、ドキュメントのこのセクションを見ると、イテレータに渡すのは関数自体ですが、非同期はその関数を独自のコンテキストで呼び出すという事実に問題があると思います。つまり、関数this内のパラメータは 'あなたが期待しているものです。

この落とし穴を避けるために、(bind を使用して) ドキュメントのアドバイスに従ってみてください。

于 2013-06-02T12:09:16.530 に答える