2017-04-04 14 views
0

APIサービスをラップして、特別な機能を作成するnextを作成しました。これはデータの次のページで呼び出します。私はちょうどreq = null設定することができ想定して、それが再び動作して停止する、しかし、コールバック関数が実行され続け、私は早くこの自動ページ付けを停止する場合未定義に設定しても機能が実行され続けます

let req = getSomeData({ param: true }, function(err, res) { 
    // Do something 
    if (res.next) { 
     res.next(); 
    } else { 
     // All data processed 
    } 
}) 

:それは私のようなものを行うことができます。

ミニマルな例は以下の通りです:

var parent = function() { 

    var runner = function(func) { 
    var next = function() { 
     return runner(func); 
    } 

    func(next) 
    } 

    var handler = function(next) { 
    console.log('handler called') 
    setTimeout(next, 2000); 
    } 

    runner(handler); 
} 

var child = new parent(); 

setTimeout(function() { 
    console.log('killing child'); 
    child = undefined; 
    console.log('child is ' + typeof child); 
}, 5000) 

5秒child = undefined後、ハンドラ関数は、2秒ごとに呼ばれ続けていますが。

デモ:http://jsbin.com/tuyebacavi/1/edit?js,console

+1

あなたは 'てclearTimeoutを呼び出す必要があります()'。 'setTimeout()'を開始したオブジェクトを単に参照解除すると、 – haim770

+0

はうまくいきません。あなたのコードに基づいて、2秒ごとに次の繰り返しのために無条件にsetTimeoutを行います。 –

+0

'setTimeout'を使ったこの例はデモです。タイムアウトを追加するだけで一時停止され、ログに迷惑をかけません。実際のバージョンはいくつかのデータ処理と外部リクエストを行い、数秒かかると「next」を呼び出します。 –

答えて

0

それがより賢明にするstop機能を追加します。

var parent = function() { 
 
    var keepRunning = true; 
 
    
 
    var runner = function(func) { 
 
    var next = function() { 
 
     return runner(func); 
 
    } 
 
    if(keepRunning) 
 
     func(next) 
 
    } 
 
    
 
    var handler = function(next) { 
 
    console.log('handler called') 
 
    setTimeout(next, 2000); 
 
    } 
 
    
 
    this.stop = function(){ 
 
    keepRunning = false 
 
    } 
 
    
 
    runner(handler); 
 
} 
 

 
var child = new parent(); 
 

 
setTimeout(function() { 
 
    console.log('killing child'); 
 
    child.stop() 
 
    console.log('child is ' + typeof child); 
 
}, 5000)

関連する問題