2017-11-17 7 views
1

promise.all()을 사용하는 루프 후에 동 기적으로 함수 목록을 실행하려고하지만 내 코드가 예상대로 작동하지 않습니다.노드 promises.all()이 예상대로 작동하지 않습니다.

누군가 내가 뭘 잘못했는지 알아?

var Promise = require('promise'); 
var promises = []; 

for (var i = 0; i < 3; i++) { 
    console.log('push promise ' + i); 
    promises.push(foo(i)); 
} 

Promise.all(promises) 
     .then(function (data) { 
      console.log("done"); 
     }); 

function foo(i) { 
    return new Promise(function (resolve, reject) { 
     console.log('---> foo i ' + i); 
     resolve('done foo ' + i); 

    }); 
} 

하지만 출력은 내가

push promise 0 
push promise 1 
push promise 2 
---> foo i 0 
---> foo i 1 
---> foo i 2 
done 

가 사전에 감사합니다 기대

push promise 0 
---> foo i 0 
push promise 1 
---> foo i 1 
push promise 2 
---> foo i 2 
done 

입니다 :

내 코드입니다.

+1

모든 약속이 만들어 질 때 해결을 시작합니다. 'Promise.all '을 호출하면 모든 인수가 해결 될 때 해결되는 또 다른 약속이 만들어집니다. 생성자 함수에는 비동기 동작이 없습니다. [setTimeout (..., 0)] (https://stackoverflow.com/questions/1360238/myfunction-vs-window-settimeoutmyfunction-0)을 사용하여 원하는 실행 순서를 얻을 수 있습니다. – allonhadaya

답변

2

당신에게 당신의 예상 출력을 제공해야합니다. 비동기 호출이 약속 내에있는 경우 (의도 한 사용 사례), 그러면 예상했던 동작이 생성됩니다.

다음은 비동기 호출로 setTimeout을 사용하고 비동기 콜백 내부에서 resolve 호출이 이루어지는 방식을 보여줍니다.

var promises = []; 

for (var i = 0; i < 3; i++) { 
    console.log('push promise ' + i); 
    promises.push(foo(i)); 
} 

Promise.all(promises) 
     .then(function (data) { 
      console.log("done"); 
     }); 

function foo(i) { 
    return new Promise(function (resolve, reject) { 
     // The async call is made inside the Promise 
     setTimeout(()=> { 
      console.log('---> foo i ' + i); 
      // And the resolve call is made inside the callback function 
      resolve('done foo ' + i); 
     }); 
    }); 
} 

이를 실행하면, 당신은 당신이 (크롬에서 테스트) 원하는 출력을 얻을해야합니다 요청이 모두 즉시 완료 때문 만 작업 (foo i 0, ... 1 ... 2이 순서대로) :

push promise 0 
push promise 1 
push promise 2 
---> foo i 0 
---> foo i 1 
---> foo i 2 
done 

부록을 하나씩. 그것이 ajax 호출이라면, foo 명령문은 완료 순으로 인쇄됩니다. 따라서 요청 2가 0 또는 1보다 먼저 완료되면 먼저 foo i 2이 표시됩니다. 그러나 done은 모든 요청이 해결 된 경우에만 표시됩니다.

-1

console.log('---> foo i ' + i);console.log('---> foo i ' + i);은 약속 생성시 resolve 메서드 외부에 있고 실행중인 함수 대신 Promise 생성자에 제공 한 실행자 함수 내에서 실행됩니다.

은 여기에서 일어나고있는 것은 당신이 약속 생성자를 호출 할 때이 건설 통화 중에 호출되는에, 함수가 전달되는 것입니다

var Promise = require('promise'); 
var promises = []; 

for (var i = 0; i < 3; i++) { 
    console.log('push promise ' + i); 
    promises.push(foo(i)); 
} 

Promise.all(promises) 
     .then(function (data) { 
      for (var i = 0; i < data.length; i++) { 
      console.log(data[i]); 
      }   
      console.log("done"); 
     }); 

function foo(i) { 
    return new Promise(function (resolve, reject) { 
     resolve('--> foo i ' + i); 
    }); 
} 
+0

'resolve' 콜백 바깥 쪽? 'resolve' 콜백은 없습니다. –

+0

그는 아마도 Executor 함수가'Promise' 생성자에 전달되었음을 의미합니다. – rossipedia

+0

맞습니다. 잘못된 용어를 사용했습니다. 금요일 오후에 늦었 어, 사과. 나는 그것을 고쳐 줄 것이다. –

0

promise.all()을 사용하여 루프를 수행 한 후에 동 기적으로 함수 목록을 실행하려고하지만 내 코드가 예상대로 작동하지 않습니다.

필자는 기능 목록을 동 기적으로 실행하고 싶습니다. 그렇다면 Bluebird Promise.each()을 사용하는 것이 좋습니다.

var Promise = require('bluebird'); 
var promises = []; 

for (var i = 0; i < 3; i++) { 
    console.log('push promise ' + i); 
    promises.push(foo(i)); 
} 

Promise.each(promises, function(result) { 
    console.log(result); 
}); 

function foo(i) { 
    return new Promise(function (resolve, reject) { 
     resolve('done foo ' + i); 
    }); 
} 

결과 :

push promise 0 
push promise 1 
push promise 2 
done foo 0 
done foo 1 
done foo 2