2015-06-25 3 views
0

У меня есть следующий скрипт, который запускает 5 запросов ajax и сообщает, когда они будут выполнены. Все, что использует jQuery, обещает и $.where.Как передать локальную переменную в функцию обещания

http://jsfiddle.net/r269j65r/

console.info('Creating promises: start'); 
var p = []; 
for(var i=0; i<5; i++) { 
    a = $.when(x(i)).done(function(){ 
     console.log('Promise ' + i + ': done'); 
    }); 
    p.push(a); 
} 
console.info('Creating promises: done'); 
console.log('Running promises: start'); 

$.when.apply($,p).done(function(){ 
    console.log('Running promises: done'); 
}); 

function x(i) { 
    console.log('Promise ' + i + ': start'); 
    return $.ajax({ 
     'url' : '/'   
    }) 
    .done(function() { 
    }); 
} 

Проблема заключается в том, что console.log('Promise ' + i + ': done'); всегда возвращает Promise 5: done, потому что i -переменную имеет значение 5, когда функция done() выполняется.

Мой вопрос: какой хороший и чистый способ дать i в контексте done() -функция в for -loop?

+0

Просто поместите его в том, что 'x' функция , – Bergi

ответ

3

Вы должны использовать замыкание, чтобы сделать эту работу (Closures on MDN)

рабочий фрагмент:

for(var i=0; i<5; i++) { 
    (function(i){ 
     a = $.when(x(i)).done(function(){ 
      console.log('Promise ' + i + ': done'); 
     }); 
     p.push(a); 
    })(i); 
} 

И полный fiddle ...

Смежные вопросы