async遍历的时候怎么延迟执行呢

发布于 2022-09-02 00:20:12 字数 2698 浏览 15 评论 0

在node中使用,用npm安装了async;
我先说一下流程,我首先遍历获取一个url数组

http://w/page/1
http://w/page/2
http://w/page/3
http://w/page/4

在遍历这个数组,每个url又会生成一个数组,

[http://w/998.html,
http://w/997.html,
http://w/996.html,
http://w/995.html,
http://w/994.html,
http://w/993.html,
http://w/992.html,
http://w/991.html,
http://w/990.html,
http://w/989.html]...

然后遍历数组里面每个url
下面我用伪码描述一下

for (var i = 1; i < 3; i++) {
    ihx.push('http://w/page/' + i);
}
self.ihx(ihx);

    ihx: function (arr) {
        var self = this;
        async.each(arr, function (item, callback) {
            setTimeout(function () {
                console.log(item)
                self.core(item, function ($) {
                    var $itemlist = $('.post-listing .item-list');
                    var linkList = $itemlist.map(function (idx, element) {
                        var $element = $(element).find('.post-title a');
                        return $element.attr('href');
                    }).get();
                    console.log("linkList===" + linkList)
                    async.each(linkList, function (item, callback2) {
                        setTimeout(function () {
                            self.core(item, function ($) {
                                var author = $('.post-inner .entry').find('p').eq(0).text();
                                var content = $.html('.article_text');
                                var text = $('.post-inner span[itemprop="name"]').text();
                                console.log("text=" + text);
                                if (!!text) {
                                    var thor = new articlema({
                                        title: text,
                                        author: author,
                                        category: '002',
                                        content: content
                                    });
                                    thor.save(function (err, thor) {
                                        if (err) return console.log(err);
                                        //console.log(thor);
                                    });

                                }
                            });
                        }, 2000)


                    }, function (err) {
                        console.log("content==============" + err);
                    });

                })
            }, 1000)
        }, function (err) {
            console.log("item==============" + err);
        })
    }

这个没有达到我想的结果 console.log(linkList),是先打印的page/2页面抓取的url,时间也没有慢下来,并且外面的循环完了,才会循环里面的,这个我应该怎么改一下

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

百善笑为先 2022-09-09 00:20:12

你不应该用async.each而应该用async.eachSeries来控制。

另外你node使用,我建议抛弃async,换用生成器+promise的写法,毕竟node.js都5.0了,有ES6不用太奇怪了。
先定义几个帮助的函数

'use strict';
const next = (gen,val) => {
     const n = gen.next(val);
     !n.done && Promise.resolve(n.value).then(d=>next(gen,d));
 }
const run = genfunc => next(genfunc());
const sleep = time=>new Promise(resolve=>setTimeout(resolve,time));

然后再重写你的业务逻辑,注意异步的部分要包裹成Promise

'use strict';
run(function* (){
    let arr = []; 
    for (var i = 1; i < 3; i++) {
        const item = yield getUrl('http://w/page/' + i);
        let $ = yield core(item);
        const $itemlist = $('.post-listing .item-list');
        const linkList = $itemlist.map(function (idx, element) {
            const $element = $(element).find('.post-title a');
            return $element.attr('href');
        }).get();
        console.log("linkList===" + linkList)
        arr.concat(linkList);
    }
    for(let i =0;j<arr.length;i++){
       yield sleep(2000);
       let $ = yield core(linkList[i]);
       const author = $('.post-inner .entry').find('p').eq(0).text();
       const content = $.html('.article_text');
       let text = $('.post-inner span[itemprop="name"]').text();
       console.log("text=" + text);
       if(!text)continue;
       const thor = new articlema({
                title: text,
                author: author,
                category: '002',
                content: content
        });
        yield thor.save().exec();
    }
})

你看这样是不是业务逻辑更清晰了呢?

缱绻入梦 2022-09-09 00:20:12

自己控制每个异步操作的执行

ihx: function (arr) {
        var self = this;
        var copyiedarr=arr.slice(0);

        function next() {
            var item = copyiedarr.shift();
            console.log(item);
            if (!item) {
                console.log('end~~');
            }
            self.core(item, function ($) {
                var $itemlist = $('.post-listing .item-list');
                var linkList = $itemlist.map(function (idx, element) {
                    var $element = $(element).find('.post-title a');
                    return $element.attr('href');
                }).get();
                console.log("linkList===" + linkList);

                nextLinkeList(linkList, function () {
                    setTimeout(function(){
                        next();
                    },1000);
                });
            });
        }

        function nextLinkeList(linkList,doneCallback){
            var copyiedarr=linkList.slice(0);

            function next(){
                var item=copyiedarr.shift();
                console.log(item);
                if(!item){
                    doneCallback();
                }
                self.core(item, function ($) {
                    var author = $('.post-inner .entry').find('p').eq(0).text();
                    var content = $.html('.article_text');
                    var text = $('.post-inner span[itemprop="name"]').text();
                    console.log("text=" + text);
                    if (!!text) {
                        var thor = new articlema({
                            title: text,
                            author: author,
                            category: '002',
                            content: content
                        });
                        thor.save(function (err, thor) {
                            if (err) return console.log(err);
                            //console.log(thor);
                        });

                    }

                    setTimeout(function(){
                        next();
                    },2000);
                    
                });
            }
            
            next();
        }
        
        next();
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文