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는 함수를 고정 시켰고, 최근에 너무 많은 언어로 프로그래밍 된 것을 예로 들었습니다. 나는 이것이 복잡한 문제라는 것을 알고 있지만 그것은 내가 직면하고있는 문제이다. 나는 그것이 '에서 온 executeQueryAsync' 않는 경우 내부 비동기 기능 – 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]); 
    } 
});