2014-10-20 2 views
1

나는 한 번에 N을 공격하려고합니다. files의 배열이 있습니다. 약속을 반환하는 함수 doWork.약속 기반 대기열

var files = [] 

var doWork = function(file) { 
    return asyncFn(file) 
} 

이 대기열에 동적으로 접근 할 수 있기를 바랍니다.

편집 : 다양한 모듈 (promise-queue, async-q)을 사용해 보았습니다. 그것들은 모두 패션에서 작동하지만 배열을 큐로 사용할 수 없습니다. 그들에게는 당신이 밀어야 할 내부 구조가 있습니다.

배열을 사용하여 큐에 항목을 넣고 큐에 없는지 확인해야하는 이유는 무엇입니까?

+2

질문에 질문을 넣어주십시오. 너는 무엇을 시도 했는가? 그리고 너는 어디에서 붙 혔는가? – jfriend00

+1

Bluebird를 사용하는 경우이 배열이 포함 된 대답이 도움이됩니다. –

+0

Bluebird를 사용하고 있지만 도움이되는 방법을 볼 수 없습니다. 이상한. –

답변

0

귀하가 사용 중이라고 말한 Bluebird에서 어떻게 할 것입니까?

var files = ["foo.txt", "bar.txt", "baz.txt"]; 
var task = Promise.map(files, doWork, {concurrency: 4}); // four at a time 

task.then(function(results){ 
     // results contains the results, tasks are executed at most 4 at a time 
}); 

주의의 단어 -이 (명백하게)보다 큰 용량 실행됩니다 여러 노드 프로세스에서 함수를 여러 번 호출, (가) 현재 호출가 실행됩니다 얼마나 많은 상 상한을두고, 또는/작은 동시성. 그러나 단순한 경우 - 이것은 효과적입니다.

+0

이것은'큐에있는 큐처럼 보이지는 않습니다.'{concurrency : 1}'일 수도 있습니다. 그리고 그것은 역동적 인 것 같지 않습니다. (OP가 대기열이 이미 실행 중일 때 작업을 추가 할 수 있다고 가정합니다)? – Bergi

+1

@Bergi의 첫 번째 줄은 : "나는 파일 배열을 가지고 있으며, 한번에 N을 공격하려고합니다. 그리고 약속을 되 찾는 함수 doWork입니다." 동적은 아니지만 확실히 대기열입니다. –

+0

당신 말이 맞아요 - 나에게서 upvote가있어 :-). @ 도미니크 (Dominic) : 이미 실행중인 대기열을 누를 수있는 솔루션을 찾고 있다면 알려 주시기 바랍니다 (답변 드리겠습니다) – Bergi

-1

당신은 이런 식으로 뭔가를 할 수 :

단계는 당신이 그것을 통과 약속을 이행하는 기능입니다
function enq (step) 
    var f = function() { 
    var d = Q.defer(); 
    step(d); 
    return d.promise; 
    } 
    enq_head = enq_head.then(f); 
} 

. 하지만 setTimeout이 훨씬 더 효율적으로 수행하는 멋진 방법 일 뿐이므로 권장하지 않습니다.

예약하거나 완료 한 파일을 추적하려면 완료 목록에 저장하거나 가져 오는 할 일 목록에서 꺼내십시오. 파일 이름 또는 뭐든간에. 스케줄링으로 인한 문제입니다.