2015-06-25 3 views
1

У меня есть цикл HTTP.post() на моем метеора сервере:HTTP.post() обратного вызова в цикле

for (var i = 0; i < smsMessages.length; i++) { 
    HTTP.post("https://smsapiaddress/sms.do", smsMesseges[i], function(error, result) { 
     if (error) { 
      setErrorInDatabase(smsMessages[i]); 
     } 
     if (result) { 
      setResultInDatabase(smsMessages[i]); 
     } 
    }); 

Как легко пройти соответствующие SMSmessages [я] в функцию обратного вызова?

+0

У вас есть опечатка в строке 3 'smsMesseges [I]' возможно, что это просто так? – saimeunt

ответ

2

Как http запрос asynchronous значение i будет использоваться для всех запросов. Используйте closures внутри петли for. Он будет хранить отдельную копию i для каждой итерации.

Смотрите комментарии выделены в коде:

for (var i = 0; i < smsMessages.length; i++) { 

    (function(i) { 
    // ^^^^^^^^^^^ 
     HTTP.post("https://smsapiaddress/sms.do", smsMessages[i], function(error, result) { 
      if (error) { 
       setErrorInDatabase(smsMessages[i]); 
      } 
      if (result) { 
       setResultInDatabase(smsMessages[i]); 
      } 
     }); 
    }(i)); // call the function with the current value of i 
    // ^^^ 
}