我在NodeJS中的一個函數內部運行一個長循環,並且知道JS本質上不允許任何東西來中斷一個函數,我想知道的是他們暫停函數執行的方法聽取客戶的要求,我目前無法做到暫停函數來偵聽請求
0
A
回答
0
有沒有很好的主意來停止請求處理。嘗試使用的承諾,這是非常粗略的例子,但可以理解的基礎理念:
...
http.createServer(function(req, res) {
let bigData = [];
//parse your big data in bigData
...
new Promise(function(resolve, reject){
for(let i = 0; i < bigData.length; i++){
//some long calculate process
//if error
return reject(error);
//if all calculated
return resolve(result);
}
})
.then(function(result){
res.end(result);
}, function(function(error){
throw error;
});
});
...
也許試試這個:
let count = 0;
for(let i = 0; i < bigData.length; i++){
/*something calculation
....
*/
count++;
//this code allow your server every 50 iterations "take a brake" and handle other requests
if(count === 50){
count = 0;
setTimeout(()=>{
}, 100);
};
};
1
在執行時不能中斷的功能。你需要做的是重構導致問題的循環。
必須打破循環本身:
- 相反的循環,每次迭代應該使用
setTimeout()
- 使用發電機呼叫下。傳入和傳出發生器會中斷事件回調並允許在其間執行其他事件。
這就是我的意思是使用的setTimeout:
鑑於功能:
function syncLoop(args) {
var localVar;
for (i = 0; i < max; i++) {
doSomething(args, localVar)
}
}
與setTimeout
(或setImmediate()
)更換循環,就像這樣:
function asyncLoop(args) {
var localVar;
function innerLoop(i){ if(i < max){
doSomething(args, localVar)
setTimeout(function(){
i++; innerLoop(i);
}, 0);
} }
innerLoop(0);
}
這樣,在每次迭代時,控件都被傳遞給事件循環,並可以提供其他獨立請求。
+0
我已經嘗試過發生器,它所做的只是將控制權交還給調用者函數,該函數仍然不允許發生其他事件。如果我出錯了,也許我會正確理解,如果你給一個代碼示例。謝謝 – akabhirav
+0
@akabhirav也許我遲到了。我給出了一些用setTimeout實現循環的代碼。至於發電機,我還沒有嘗試過自己。 –
相關問題
- 1. 暫停事件偵聽器在後臺
- 2. mIRC Bot:偵聽HTTP請求
- 3. 請求在Quickfix中暫停?
- 4. 暫停Web請求(線程)
- 5. 暫停URL請求下載
- 6. 在RequestHandler主體中偵聽http請求
- 7. 插座沒有偵聽多個請求
- 8. 暫停請求當應用程序轉到後臺時收聽
- 9. 暫停函數執行流程直到ajax請求完成
- 10. 如何創建一個Bash偵聽器來接收PHP請求?
- 11. Python模塊偵聽來自Apache的WSGI請求?
- 12. 停止位置偵聽器
- 13. 閱讀請求暫停服務器
- 14. PyQt5加載spinner暫停發帖請求
- 15. 全部暫停導航請求
- 16. 暫停iAd的請求發出
- 17. jetty continuation - 暫停的請求 - 資源
- 18. req.pause()對完成請求暫停下一個請求
- 19. 黑莓聽音器暫停?
- 20. 暫停Linux內核函數
- 21. 如何暫停javascript函數
- 22. tkinter.after()函數沒有暫停
- 23. 運行函數暫停父函數
- 24. Node.JS EventEmitter偵聽器必須是函數
- 25. 線程化UDP偵聽器函數
- 26. 如何可以打開一個端口來偵聽服務器請求?
- 27. XCode iDevice應用程序 - 如何偵聽來自服務器的消息/請求?
- 28. 切換按鈕暫停/取消暫停音頻監聽器
- 29. 長時間的HTTP請求會暫停WebSocket數據傳輸?
- 30. 如何暫停/停止功能,直到SOAP請求完成
您可以使用生成器 –
生成器幫助的唯一事情是將控制權歸還給調用者,而調用者在任何情況下都將是另一個函數。我不知道是否可以從其他功能獲得請求 – akabhirav
而不是實現暫停功能,請更改您的設計。嘗試將所有請求存儲在一個隊列(對象變量)中,運行一個while循環並只保持監聽隊列。 –