0

Async libでnodejsを使用するのに少し問題があります。

問題は次のとおりです。Web サイトからリンクを取得して配列に表示しようとしています。
問題は、スクリプトを実行すると、最初に 2 番目の関数が表示され、次に最初の関数が表示されることです。
なんで ?:/

var request = require("request");
var cheerio = require("cheerio");
var async = require("async");
var homepage = "http://xxx";
var start = [];

async.series([

function(callback){
    //Request to website
    var myVisit = request(homepage,function(err,resp,body){
        if(err) throw err

            $ = cheerio.load(body);
    ////Get all the links in the list
            $('aside ul li').each(function(){
                start.push($(this).find('a').attr('href'));
            });
            console.log(start);
    });

    callback(null, myVisit);
},
    /// Dummy function 
function(callback){
    var display = console.log("Blabla");
    callback(null,display);
}


]);

///Outputs 'Blabla' and then the links array 
4

2 に答える 2

0

これは、がタスク/関数を呼び出す順序を保証していても、結果が別の非同期関数呼び出しasync.seriesによって生成された場合、結果の順序を保証できるわけではないためです。

次のように使用した場合:

async.series([
    function(callback){
        // do some stuff ...
        console.log('one');
    },
    function(callback){
        console.log('two');
    }
]);

あなたはこれを得るでしょう:

one
two

ただし、非同期を指定すると、その関数が終了した後にのみ実行request(...)されることを意味します。log

次のようにテストできます。

var request = require("request");
var cheerio = require("cheerio");
var async = require("async");
var homepage = "http://xxx";
var start = [];

async.series([

function(callback){
    console.log('1st async task');
    //Request to website
    var myVisit = request(homepage,function(err,resp,body){
        if(err) throw err

            $ = cheerio.load(body);
    ////Get all the links in the list
            $('aside ul li').each(function(){
                start.push($(this).find('a').attr('href'));
            });
            console.log(start);
    });

    callback(null, myVisit);
},
    /// Dummy function 
function(callback){
    console.log('2nd async task');
    var display = console.log("Blabla");
    callback(null,display);
}


]);

これで、次の出力が得られるはずです。

1st async task
2nd async task
Blabla
[links]
于 2013-10-24T09:16:42.940 に答える
0

最初の関数の間違った場所で非同期コールバック関数を呼び出しています。リクエスト関数呼び出しは非ブロッキングであり、コードは次の行に移動します。非同期シリーズの場合、非同期のコールバックが呼び出されるとすぐに関数を離れ、次の関数の実行を開始します。

可能な解決策は、リクエストのコールバック内にcallback(null, myVisit)を配置することです。request 関数が結果を返すのを待ちます。すべてのリンクを取得してから、非同期のコールバックを呼び出します

于 2013-10-24T09:12:27.063 に答える