2016-11-22 4 views
0

기능에 대한 SMS를 보내려고합니다. 그러나 문제는 다음과 같습니다. 함수가 완료되는 데 약 10-15 초가 걸립니다 (PhantomJS로 여러 가지 작업을 수행하기 때문에).비동기 기능 대기

_.each(users, function(userData){ // This does not work since i need to wait for 15 seconds 
    smsFree.sendSMSFree(userData, productUrl); 
}); 

나는 setTimeout을 사용해 보았지만 잘 작동하지 않았습니다.

저는 NodeJS에 있습니다. 내 문제를 해결하기 위해 Async 또는 다른 라이브러리를 활용하려면 어떻게해야합니까?

15 초를 기다린 후 두 번째 객체로 돌아가고 싶습니다. 이것이 어떻게 달성되는지 확실하지 않습니다. (Async.serial?)

  • R은
+0

함수가 완료되면 어떻게 알 수 있습니까? 그것은 약속을 되 돌리는가? 콜백을 요청 하시겠습니까? –

+0

@ MadaraUchiha 내 다른 기능이 콜백을한다고 가정 해 봅시다. 이제 다른 객체를 반복하기 전에 이것을 어떻게 수정할 수 있는지 알려주시겠습니까? – TechnoCorner

+0

이상적으로, 당신은 약속에 대해 배워야합니다.이 후 조화 스위치를 사용하여 V7 노드에 숨겨져있는 멋진 기능을 사용할 수 있습니다. 'async' &'await'. – Keith

답변

4

당신은 promise patternwith Q를 사용해야합니다. 당신의 함수는 약속을 반환해야하고 일이 될 것입니다 쉽게 : 함수가 약속 패턴를 사용하지 않는 경우에는 사용을 포장 할 수 있습니다

Promise.all(users.map(user => smsFree.sendSMSFree(userData, productUrl))) 
     .then(() => { 
      // Do stuff once every SMS has been successfully sent! 
     }); 

:

Q.all(users.map(user => smsFree.sendSMSFree(userData, productUrl))) 
     .then(() => { 
      // Do stuff once every SMS has been successfully sent! 
     }); 

또는 표준 Promise 전체 패턴 또는 당신은 비동기 계속 구현의 측면에서 붙어있을거야 ...

2

그 신속하고 더러운 솔루션 그 m 당신을위한 ight 작업 :

var n = 0; 
_.each(users, function (userData) { 
    setTimeout(function() { 
    smsFree.sendSMSFree(userData, productUrl); 
    }, 15000 * n++; 
}); 

은 15000 밀리 초 (15초) 그들 사이의 간격마다 반복에 대한 기능을 실행합니다. 이것은 을 수행 할 수있는 유일한 방법이며sendSMSFree은 콜백을 받거나 약속을 반환하지 않습니다.

약속을 반환하면 (질문에 해당 함수가 어떻게 작동하는지 설명하지 않았 음) 동시에 모두 실행하려고하지만 모두 끝날 때까지 기다려야합니다. 답변보기 Matías Fidemraizer.

순차적으로 실행하려는 경우, 즉 이전 버전을 마친 직후에 새로운 버전을 실행하려면 더 복잡해집니다. 이전 하나가 완료되기 전에 15 초 지연을 추가하기를 원하면 다음 단계를 시작하십시오.

함수가 콜백을받는 경우 async.series을 사용할 수 있습니다.

약속을 되 돌리거나 콜백을 전혀하지 않는지 여부를 알지 못하기 때문에 자세히 설명하지 않아도됩니다. 이것은 모두 추측입니다.당신은 당신이 관심이 있다면 약속과 콜백 작업 방법을 설명하는 다른 답변을 볼 수

: 요약

루프에서 호출하는 함수가 약속을 되 돌리거나 콜백을 받으면 지연 시간 만 추가하여 지연시킬 수 있습니다.

약속을 반환하면 Q 또는 Bluebird를 사용하여 흐름을 제어 할 수 있습니다.

콜백이 필요한 경우 비동기를 사용하여 흐름을 제어 할 수 있습니다.