2017-01-30 18 views
1

forループでは、ループバック関数(model.find())を呼び出し、コールバックメソッドを使用します。この方法では、変数を指定するためにforループのi変数が必要ですが、クロージャからはアクセスできません。 コールバック関数の後ろに(i)またはcall(this,i)と書いてみましたが、機能しませんでした。Forループ内のループバックコールバック

for (var i = 0; i < $scope.objects.length; i++) { 
        Priority.find({ 
         filter: { 
          where: {priority: $scope.selectedPriority[i].priority} 
         } 
        }, function (prios) { 
          Priority.create({"priority": $scope.selectedPriority[i].priority //i is not accessible 
          }, function (priority) { 
           $scope.selectedPriority[i].priority = undefined; //i is not accessible 
          }, function (error) { 
           console.log(error); 
          }); 
         } 
        }); 

     } 

答えて

0

実際に「i」が定義されている必要がありますが、あなたは常にその最高値でそれを見つけることができます(= $ scope.objects.length - 1)、その理由はPriority.findが非同期であるため、一度答えを返すと、forループはすでに反復処理を行っています。それを解決するために

、あなたが関数の内部ループの本体を置くことができます:

function find(i) { 
    Priority.find({ 
          filter: { 
           where: {priority: $scope.selectedPriority[i].priority} 
          } 
         }, function (prios) { 
           Priority.create({"priority": $scope.selectedPriority[i].priority //i is not accessible 
           }, function (priority) { 
            $scope.selectedPriority[i].priority = undefined; //i is not accessible 
           }, function (error) { 
           console.log(error); 
           }); 
         } 
         }); 
} 

それではforループとなり、:

本質的
for (var i = 0; i < $scope.objects.length; i++) { 
    find(i); 
} 

、あなたは "キャプチャ" していますあなたが特定の関数呼び出しのコンテキストにいる限り、 "i"の値を関数の引数として送信すると、固定されたままになります。