13

を使用する以外に、node.js のコールバック関数に変数を渡すより良い方法はありますかbind()?

次に例を示します。

var fs = require('fs');

for(var i = 0; i < 100; i++) {
    fs.writeFile(i + ".txt", i, function(error) {
        fs.stat(this.i + ".txt", function() {
            fs.rename(this.i + ".txt", this.i + ".new.txt", function() {
               console.log("[" + this.i + "] Done...");
            }.bind({ i: this.i }));
        }.bind({ i: this.i }));
    }.bind({ i: i }));
}

bind()の値を渡すだけのメソッドに注意してくださいi

ありがとう。

4

4 に答える 4

15

JavaScriptの変数は、関数スコープ全体で有効です。これは、変数x((var x = ...)を定義でき、すべての関数で引き続きアクセスできることを意味します。同じ呼び出しスコープ内で定義します(詳細については、JavaScriptクロージャを参照してください)。

iあなたの場合の問題は、あなたがの間にあなたを操作することですfor loop。コールバック関数のにアクセスするだけで、ループに含まれなくなっiた最初の値を受け取ることになります。

i次のように、as引数を使用して新しい関数を呼び出すことで、これを回避できます。

var fs = require('fs');

// still use your for-loop for the initial index
// but rename i to index to avoid confusion
for (var index = 0; index < 100; index++) {
  // now build a function for the scoping
  (function(i) {
    // inside this function the i will not be modified
    // as it is passed as an argument
    fs.writeFile(i + ".txt", i, function(error) {
      fs.stat(i + ".txt", function() {
        fs.rename(i + ".txt", i + ".new.txt", function() {
          console.log("[" + i + "] Done...");
        });
      });
    });
  })(index) // call it with index, that will be i inside the function
}
于 2012-09-28T06:36:31.403 に答える
7

以下でやりたいと思います。

var fs = require('fs');

var getWriteFileCallback = function(index) {
  return function(error) {                           
    fs.stat(index + '.txt', function() {             
      fs.rename(index + '.txt', index + '.new.txt', function() {
        console.log("[" + index + "] Done...");      
      });                                            
    });                                              
  };                                                 
}                                                    

for(var i = 0; i < 100; i++) {
  fs.writeFile(i + ".txt", i, getWriteFileCallback(i));
}
于 2012-09-28T06:45:31.577 に答える