2017-08-26 75 views
0

我與我所相信的嘗試是promise-queue承諾隊列處理亂序

var Queue = require("promise-queue") 
let queue = new Queue(); 

//add first item to queue 
queue.add(() => { 
console.log('start 1'); 
return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      console.log('finished processing'); 
      resolve(); 
     }, 
     5000); 
    }); 
}); 

//add second item to queue 
queue.add(() => { console.log('start 2'); }); 

導致輸出基本用例:

>start 1 
>start 2 
>finished processing 

的第二個項目之前,首先啓動項目已完成。我錯過了什麼?

試試這個代碼示例runkit

+0

您注意到調用堆棧和隊列,這使得JavaScript的非常特殊的作用。您的代碼在大約20ms內執行整個文件。 JS解釋器命中第5行並記錄1,然後將承諾加載到隊列中,然後立即執行'start 2',然後在5秒後立即解決承諾。 – agm1984

+0

我現在正在查看您的代碼,但我不知道承諾隊列如何工作以正確推理您應該做什麼。 – agm1984

+2

也許嘗試將它添加到代碼的頂部,因爲它可能允許兩者同時運行:'const maxConcurrent = 1; const maxQueue = 1; const queue = new Queue(maxConcurrent,maxQueue);' – agm1984

回答

1

如果你改變

let queue = new Queue(); 

使用併發參數

let queue = new Queue(1); 

那麼你的代碼工作像您期望的

也許有一個>承諾隊列中的1個默認併發性爲

看着the source code,則默認爲Infinity同時承諾

+0

你能解釋一下有一個無限量的併發承諾的'隊列'的目的是什麼?即這種隊列的真實世界用法是什麼? – wal

+0

我不知道爲什麼默認會這麼反直覺 –

+0

好我不是唯一的 – wal