2017-05-24 80 views
0

我在NodeJS中的一個函數內部運行一個長循環,並且知道JS本質上不允許任何東西來中斷一個函數,我想知道的是他們暫停函數執行的方法聽取客戶的要求,我目前無法做到暫停函數來偵聽請求

+1

您可以使用生成器 –

+1

生成器幫助的唯一事情是將控制權歸還給調用者,而調用者在任何情況下都將是另一個函數。我不知道是否可以從其他功能獲得請求 – akabhirav

+0

而不是實現暫停功能,請更改您的設計。嘗試將所有請求存儲在一個隊列(對象變量)中,運行一個while循環並只保持監聽隊列。 –

回答

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); 
    }; 

}; 
+0

但我在說的是,當promise中的回調將運行時,它將停止監聽請求並對它們進行排隊,這是因爲js是單線程的,在執行某個函數時它不會執行任何操作,但是我會如果它很快起作用,請嘗試並回復 – akabhirav

+0

不能,一旦函數執行開始,就無法工作,無法中斷它。 – akabhirav

+0

我正在更新我的答案,也許它會幫助你 – Sergaros

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實現循環的代碼。至於發電機,我還沒有嘗試過自己。 –