2017-02-07 5 views
-3

일부 논리를 비동기 적으로 만드는 배열이 있습니다 (예 : ajax 호출). 배열에서 함수를 순차적으로 호출하는 함수는 어떻게 생겼습니까?JavaScript 순차 비동기 함수 호출

var saveHandlers = []; 

saveHandlers.push(function() { 
    var deferred = $.Deferred(); 

    setTimeout(function() { 
     deferred.resolve(); 
    }, 2000); 

    return deferred.promise(); 
}); 

saveHandlers.push(function() { 
    var deferred = $.Deferred(); 

    setTimeout(function() { 
     deferred.resolve(); 
    }, 2000); 

    return deferred.promise(); 
}); 

$(function() { 
    var $form = $('#form'); 

    $form 
     .unbind('submit') 
     .submit(function (e) { 
      if (saveHandlers.length > 0) { 
       $.when.apply(null, saveHandlers); 
      } 
      e.preventDefault(); 
     }); 
}); 
+0

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise – Archer

+1

, 읽어 보시기 바랍니다 [A, 최소 완료하고 검증 가능한 예제를 만드는 방법 (HTTP ://stackoverflow.com/help/mcve) 당신이 시도한 것을 보여주십시오. 그래서 우리는 그 문제를 논의하기 위해 시작할 수 있습니다. – Andrea

+0

@Archer 배열은 ** Promises **로 구성되어 있습니다. 그러나 길이는 동적입니다. 주요 기능은 어떻게 생겼을 까? –

답변

0

비동기 함수를 호출하고 배열 인덱스를 인수로 취하는 함수를 작성하십시오.

async 함수의 콜백에서 인덱스를 증가시키고 (배열의 끝까지 도달하지 않은 경우) 함수를 새 인덱스로 재귀 적으로 호출하십시오.

var foo = [fun_a, fun_b, fun_c]; 

function bar(index) { 
    index = index || 0; 

    function callback() { 
     if (foo[++index]) { 
      bar(index); 
     } 
    }; 

    foo[index]().then(callback); 
}