2014-05-20 2 views
7

저는 새로운 약속이며 다음 실습에 매달 렸습니다.루프 내에서 중첩 된 약속을 연결합니다.

값 배열이 있으며 각 값에 비동기 호출을 실행하려고합니다. 콜백에서 첫 번째 호출 결과에 대해 다른 호출을 실행하려고합니다.

기본적으로, 나의 좌절은 다음에 있습니다 실행의 순서 것은해야한다 '1x2x3x'하지만 순서가 '123xxx'즉

때, 서브, 루프는 이미 다음 반복에가는 이 아마도 쉬운 솔루션입니다하지만 난 그것에 붙어

var values = ["1", "2", "3"]; 

function do(val) { 
    var deferred = Q.defer(); 


    asyncCall(val) 
    .then(function(response) { 
    console.log(val); 
    asyncCall(response) 
    .then(function (response) { 
     console.log('x'); 
     deferred.resolve(true) 
    }); 
    }); 

    return deferred.promise; 
} 

var result = do(values[0]); 

values.forEach(function(f) { 
    result = result.then(do(f)); 
} 

첫 번째 약속의/중첩 된 약속은 .. 아직 fullfilled되지 않습니다.

답변

5

지연이 필요하지 않습니다. 약속 체인 이후에 deferred anti pattern이 있습니다.

또한 해결하기를 기다리는 경우 .then 처리기에서 약속을 반환해야합니다.

당신은 단순히 for 루프를 사용할 수 있습니다

function do(val) { 

    var q = Q(); 
    for(var i = 0; i < val; i++){ 
    q = q.then(asyncCall.bind(null,i)) 
     .then(console.log.bind(console)) 
     .then(console.log.bind(console,"x")); 
    } 

    return q; // in case you want to chain 
} 

fiddle합니다.

참고 : 바인딩은 함수 호출의 값을 고정시킵니다. 첫 번째 매개 변수 (값)가 null 인 경우이 경우 function(fn,arg){ return function(arg){ return fn(arg); }}과 같은 역할을합니다. 즉, 함수 호출을 "부분 응용 프로그램"으로 변환합니다. 자세한 내용은 the MDN docs을 참조하십시오.

+0

답장을 보내 주셔서 감사합니다. – strai

+0

답변 해 주셔서 감사합니다. 그러나 나는 완전히 이해하지 못합니다. 다음과 같이 나는 연기 패턴을 제거하고 내 코드를 리팩토링 한 : 기능 (값) { 반환 asyncCall (값) 그 때는 (기능 (응답) { 을 console.log (응답)를 검색 ( 반환 response.asyncCall2을); } . (기능 (응답) { console.log (응답); }); 첫 번째 '그 다음'에 반환 할 수 있지만 asyncCall2의 약속은 두 번째로 전달되지 않습니다. – strai

+0

@strai jsfiddle.net에서 피들을 만들 수 있습니까? 이것은 읽기가 어렵습니다 –

관련 문제