2014-12-19 109 views
0

我開始使用腳本(而不是webapp),並且這對我來說是莫名其妙的。我有以下簡單功能:NodeJS:前一個函數返回前的函數返回

var request = require('request'); 

function first_func(name) { 
    console.log('first_func(' + name + ')'); 
    var url = 'http://...' + name; 
    var answers = new Array(); 
    request(url, function(error, resp, html) { 
    ... 
    answers.push(x); 
    }); 
    return answers; 
} 

function second_func(answers) { 
    var results = new Array(); 
    for (var a in answers) { 
    var url = 'http://...' + a; 
    request(url, function(error, resp, html) { 
     ... 
     results.push(x); 
    }); 
    } 
    return results; 
} 

first_func()廢料的目錄頁,second_func()廢料該條特定頁面。運行該腳本這樣在腳本的末尾:

var names = ['a', 'b', ...]; 

function main() { 
    for (var n in names) { 
    var ans = first_func(names[n]); 
    console.log('answers: ' + ans); 
    for (var a in ans) { 
     second_func(ans[a]); 
    } 
    } 
} 

main(); 

出於某種原因在的NodeJS並行做first_func()second_func()。爲什麼在運行second_func()之前不等待first_func()完成?輸出是:

答案:未定義

first_func(一)

first_func(B)

...

爲什麼跳的NodeJS成內formain()之前循環等待first_func()返回?

+3

歡迎來到令人興奮的異步編程世界! 'request'是一個異步方法,所以'first_func'和'second_func'在調用'request'回調函數之前返回。 – JohnnyHK

+0

這個相關的問題應該有助於澄清發生了什麼事情:http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron – JohnnyHK

回答

1

您可以使用async module來解決此問題。它看起來像下面這樣:

var request = require('request'); 
var async = require('async'); 

function first_func(name, done) { 
    console.log('first_func(' + name + ')'); 
    var url = 'http://...' + name; 
    request(url, function(error, resp, html) { 
    ... 
    done(answers); 
    }); 
} 

function second_func(answers, done) { 
    var results = new Array(); 
    async.each(answers, function(answer, next) { 
    var url = 'http://...' + a; 
    request(url, function(error, resp, html) { 
     ... 
     results.push(x); 
     next(); 
    }); 
    }, function(err) { 
    done(results); 
    }); 
} 

var names = ['a', 'b', ...]; 

function main() { 
    async.each(names, function(name, next) { 
    first_func(name, function(err, answers) { 
     second_func(answers, function(results) { 
     // do something wit results 
     next(); 
     }); 
    }); 
    }, function(err) { 
    // done will everything 
    }); 
} 

main(); 

當您完成獲取所需值而不是返回值時,您基本上會調用一個函數。異步模塊將允許您以異步友好的方式遍歷數組。

+0

太棒了,謝謝蒂姆。 – fandingo