0

我在使用带有异步库的 nodejs 时遇到了一点问题。

这是问题所在:我正在尝试从网站获取链接并将它们显示在数组中。
问题是,当我运行脚本时,它首先显示第二个函数,然后显示第一个函数。
为什么 ?:/

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 系列,只要调用 async 的回调,它就会离开函数并开始执行下一个函数。

可能的解决方案是将callback(null, myVisit)放在请求的回调中。您等待请求函数返回结果。获取所有链接,然后调用 async 的回调

于 2013-10-24T09:12:27.063 回答
0

这是因为,即使async.series保证了调用任务/函数的顺序,也不意味着如果结果是由另一个异步函数调用产生的,则它可以保证结果的顺序。

如果你像这样使用它:

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

你会得到这个:

one
two

但是指定 asyncrequest(...)意味着它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 回答