2015-10-19 144 views
0

我不明白爲什麼在下面的函數中不會調用回調函數。奇怪的是,除了else塊中的回調被調用外,將回調放在if聲明中的任何位置也適用。在遞歸函數中不會調用回調函數

我不明白爲什麼它會跳過回調。

var get_page = function(options, callback){ 

request_wrapper(c_url(options), function(xml){ 

    parseString(xml, function (err, result) { 

     if(result["feed"]["entry"] != undefined){ 

      async.eachSeries(result["feed"]["entry"], function(entry, iter) { 

       total_entries++; 
       iter(); 

      },function(){ 
       options.start = total_entries; 
       get_page(options, function(){ 
       }); 
      }); 

      // callback({}); works anywhere in the if statement. 

     }else{ 

      callback({}); // Doesn't work here. 

      // But this shows. 
      console.log("TOTAL ENTRIES HERE: "+total_entries); 

      //So why is callback in the same block not being called? 

     } 
    }); 
}); 
} 

這是我打來的函數,如果有幫助。正如我所說,它確實輸出,而不是在else塊中。

exports.scrape = function(options, callback){ 
    get_page(options, function(ob){ 
     console.log(ob); 
    }); 
} 

更新: 我只是偶然得到答案時偶然發現。遞歸調用不應該是這樣的:

get_page(options, function(){ 
}); 

它應包括在函數參數的回調,像這樣:

get_page(options, callback); 

這是我的問題的解決方案,但我不知道我明白它爲什麼起作用。謝謝您的幫助。

+0

是'typeof運算callback'了'function'? –

+0

你究竟知道它沒有被調用?您沒有發佈回調函數本身的樣子,也沒有發佈最初調用'get_page()'本身的方式。 – Pointy

+0

是否因爲你的測試用例從未經過'else'塊? –

回答

0

你試過在你後面執行回調if/else嗎?

var get_page = function(options, callback){ 

request_wrapper(c_url(options), function(xml){ 

    parseString(xml, function (err, result) { 

     if(result["feed"]["entry"] != undefined){ 

      async.eachSeries(result["feed"]["entry"], function(entry, iter) { 

       total_entries++; 
       iter(); 

      },function(){ 
       options.start = total_entries; 
       get_page(options, function(){ 
       }); 
      }); 

     }else{ 
      // But this shows. 
      console.log("TOTAL ENTRIES HERE: "+total_entries); 
     } 

     callback({}); // Does this work ? 

    }); 
}); 

}

+0

您也可以在代碼中添加「調試器」關鍵字,並逐步檢查您的方法未執行的原因。 – wawawoom

+0

謝謝,但它必須在else語句中,因爲那是進程完成時的情況。 – AppTest

+0

哪個「過程」/方法? – wawawoom