2014-10-23 3 views
0
var deferred = $.Deferred(); 

function doSomething() { 
    for (i = 1; i < 10; i++) { 
     context.executeQueryAsync(function() //success function 
     { 
      if (check_i_val(i)) { 
       context.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed)); 
      } 
     }, 

     function (sender, args) //failure function 
     { 
      console.log(args.get_message()); 
     }); 
    } 
} 

function success() { 
    console.log(i); 
} 

function failed() { 
    //display error 
} 

function check_i_val(val) { 
    if (val = 1 || val = 3 || val = 5 || val = 7) { 
     return true; 
    } 
} 

Я хочу, чтобы это производило 1,3,5,7 в этом порядке - фактическая функция, которую я использую, более сложна, чем это, и имеет время загрузки, поэтому результаты являются неожиданными. Как я могу использовать отложенные (как обещание jquery), чтобы мой код запускался последовательно?Асинхронное согласование в петле

+0

Вы понимаете, что ваша функция 'check_i_val' неверна, правильно? –

+0

Кроме того, нет ничего, что связано с обещаниями, кроме вашего пустого, отложенного в вашем коде. Может быть, вы хотите начать с чего-то меньшего? –

+0

ok исправил функцию, я просто создал ее в качестве примера, в последнее время программировал слишком много языков. Я знаю, что это сложная проблема, но это проблема, с которой я столкнулся. Мне нужно убедиться, что цикл повторяется только после того, как он получил обещание от внутренней функции async. – John

ответ

1
function mockExecuteQueryAsync(inValue) { 
    var outValue = $.Deferred(); 

    window.setTimeout(function() { 
     window.console.debug(Date.now(), 'Resolving ', inValue); 
     // Let's just return the value we got as input 
     outValue.resolve(inValue); 
    }, Math.random() * 10000); // Random interval... 

    return outValue.promise(); 
} 

var arrayOfPromises = []; 
var arrayOfValues = [1, 3, 5, 7]; 
for (var i in arrayOfValues) { 
    arrayOfPromises.push(mockExecuteQueryAsync(arrayOfValues[i])); 
} 
$.when.apply($, arrayOfPromises).done(function() { 
    window.console.debug(Date.now(), 'And now we have all the results...'); 
    for (var i in arguments) { 
     window.console.log(arguments[i]); 
    } 
}); 
Смежные вопросы