如何将局部变量传递给promise done函数

时间:2015-06-25 21:58:52

标签: javascript jquery promise

我有以下脚本,它运行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中的instanceof - 函数的上下文是一种好的,干净的方法吗?

1 个答案:

答案 0 :(得分: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 ...