阻塞事件循環,我想實現一個事件循環。循環的目的很簡單:A暫無在的NodeJS
- 如果隊列不空,讓任務在隊列中的最老的項目。
- 進程任務
- 如果任務生成返回值,則將其緩存。
- 檢查隊列中的任務。
- 如果隊列不爲空,採取下一個任務作爲當前任務的上下文。
- 將緩存的返回值傳遞給新任務。
我嘗試一個實現中的NodeJS以下列方式:
function task(){
this.task = Array.prototype.shift.call(arguments);
this.state = 'unprocessed';
this.successCallback = null;
this.failureCallback = null;
}
task.prototype.afterThat = function(){
if(arguments.length > 1){
this.successCallback = Array.prototype.shift.call(arguments);
this.failureCallback = Array.prototype.shift.call(arguments);
}
}
task.prototype._loop = function(){
let ctx = this;
while(ctx.state === 'unprocessed'){ // Source of problem
setImmediate(this.task, function(){
// change ctx.state if needed
}, function(){
// change ctx.state to 'processed'
});
}
}
這種實現方式,並且一個事件循環的之間的差別如下:
- 而不是保持一個數組的任務,successCallback可以實例化一個新任務作爲它的返回值,然後作爲當前任務被採用。
- 基於該處理中,任務狀態必須改變(或不,如果一個新的未決任務被通過了,具有其狀態爲「未處理的」)。
我相信問題是setImmediate調用,它不能更改上下文狀態,因爲當前執行狀態永遠不會終止,並且不斷爲事件隊列中的同一任務添加新的調用。
我希望我已經解釋清楚了,並希望得到一些實施指南,以及我對理解事件隊列的任何錯誤。
謝謝。
我建議更好地縮進你的代碼。我相信你定義'task.prototype.afterThat'的'裏面task.prototype._loop'。 –
你'while'循環是一個無限循環。 JS是單線程的,因此沒有別的東西可以運行,因爲你的while循環。完成運行任務後,您需要檢查'ctx.state'。 'setImmediate()'不是阻塞的。它不運行,直到你'while'循環完成這是一個無限循環,所以它從來沒有做過。 – jfriend00