NodeJs 异步瀑布(回调方法不是函数)

阿维拉克

我在使用异步瀑布时遇到问题,我发现在调用第二个回调 (cbNumPages) 后,第一个参数“pages”是下一个函数的实际回调,而不是它应该是的最后一个参数“cbGetFiles”(如据我所知异步瀑布说最后一个参数应该总是回调,在这种情况下显然不是)。

代码如下:

async.waterfall
            ([
                function(cbNumPages)
                {
                    request({
                        url: 'any-url',
                        qs: {},
                        method: 'GET',
                        headers: {
                            'Authorization' : 'any-auth'
                        }
                    }, (err, response, body) => {
                        if (!err && response.statusCode == 200)
                        {
                            var $ = cheerio.load(body);
                            var pagesList = $('ol.aui-nav').children();
                            if(pagesList.length<1)
                            {
                                var numPages = 1;
                            } else {
                                var numPages = pagesList.length-2;
                            }
                            console.log(numPages);
                            var pages = new Array(numPages),
                                total = numPages*20,
                                iterator = 0;

                            async.eachSeries(pages, function(page, cb)
                            {
                                if(page>1)
                                {
                                    pages[iterator] = iterator;
                                }else {
                                    pages[iterator] = iterator*20;
                                }
                                iterator++;
                                cb();
                            }, function(err){
                                if(err) cbNumPages(err);
                                cbNumPages(null, pages);
                            });
                        } else {
                            cbNumPages(err);
                        }
                    })
                },

                function(pages, cbGetFiles)
                {
                    var files = [];
                    var limitDate = moment().tz('Europe/Madrid').subtract(330,'days').format();

                    async.eachSeries(pages, function(page, cb)
                    {
                        request({
                            url: 'any-url'+page,
                            qs: {},
                            method: 'GET',
                            headers: {
                                'Authorization' : 'any-auth'
                            }
                        }, (err, response, body) => {
                            if(!err && response.statusCode == 200)
                            {
                                var $ = cheerio.load(body);
                                var rows = $('tr[id^=\'attachment-\']');
                                async.eachLimit(rows, 1, function(row, cb)
                                {
                                    var id = row.attribs['id'];
                                    var file = row.attribs['data-attachment-filename'];
                                    var author = $(row).children('.creator').text().trim();
                                    var created = $(row).children('.created-date').text().trim();
                                        created = moment.tz(created, 'MMM D, YYYY', 'Europe/Madrid').format();
                                    var urlFile = 'simple-file' + $(row).children('.filename-column').children('.filename').attr('href');
                                    var extension = row.attribs['data-attachment-filename'].split('.');
                                        extension = extension[extension.length-1];
                                    if(created<limitDate && validExtensions.indexOf(extension)>-1)
                                    {
                                        var f = '{ "id": "' + id + '",';
                                            f += ' "file": "' + file + '",';
                                            f += ' "url": "' + urlFile + '",';
                                            f += ' "author": "' + author + '",';
                                            f += ' "modified": "' + created + '" }';
                                        files.push(JSON.parse(f));
                                    }
                                    cb();
                                }, (err) => {
                                    if(err) cbGetFiles(err);
                                });
                                cb();
                            } else {
                                cb(err);
                            }
                        });
                    }, function(err){
                        if(err){
                            cbGetFiles(err);
                        } else {
                            cbGetFiles(null, files);
                        }
                    });
                },

                function(files, cbGetAutors)
                {
                    var filesFinal = {};
                    for(var f in files)
                    {
                        if(!filesFinal[files[f].author])
                        {
                            var ff = {};
                            for(var i in files)
                            {
                                if(files[i].author === files[f].author)
                                {
                                    ff[files[i].file] = files[i].url;
                                }
                            }
                            filesFinal[files[f].author] = ff;
                        }
                    }
                    cbGetAutors(null, JSON.parse(JSON.stringify(filesFinal)));
                },

                function(filesFinal, cbSendEmail)
                {
                    var authors = Object.keys(filesFinal);
                    async.eachSeries(authors, function(author, cb)
                    {
                        var name = author.split(' ');

                        var email = '[email protected]';
                        var msg = '<p>Hi ' + author + ',</p><p>how is it going:</p><p>';
                        for(var a in Object.keys(filesFinal[author]))
                        {
                            msg += '<p style="margin-left:20px"> '+ICON_DOC+' <a href="';
                            msg += filesFinal[author][Object.keys(filesFinal[author])[a]]+'">'+Object.keys(filesFinal[author])[a]+'</a></p>';
                        }
                        msg += '</p></p><p><b>NOTE: This is a no-reply address.</b></p><p>Have a nice day! '+ICON_MONKEY+'</p>';

                        var message = {
                            text:    msg,
                            from:    '[email protected]',
                            to:      email,
                            bcc:     '',
                            subject: 'Sample subject',
                            attachment: [{data: msg, alternative: true}]
                        };

                        serverEmail.send(message, function(err, message)
                        {
                            if(err)
                            {
                                cb(err);
                            } else {
                                console.log(message);
                                cb();
                            }
                        });

                    }, function(err){
                        if(err) cbSendEmail(err);
                        cbSendEmail();
                    });
                }

            ], (err) => {
                if(err) console.log(err);
            });

我想知道是否有办法控制这个问题,或者至少我想做的事情是否有其他选择。

谢谢。

帕里托什·古普塔

使用异步瀑布的更好(整洁)方式。

确保return在任何回调函数之前使用我已经在代码中添加了它们。

此外,如果您嵌套 eachSeries,最好为回调函数指定与父回调函数不同的名称。

我已将子级async.series的'cb'更改为'inner_cb'

更新代码:

async.waterfall
([
    funcOne,
    funcTwo,
    funcThree,
    funcFour    
], (err) => {
    if(err) console.log(err);
});

funciton funcOne(cbNumPages) {
    request({
        url: 'any-url',
        qs: {},
        method: 'GET',
        headers: {
            'Authorization' : 'any-auth'
        }
    }, (err, response, body) => {
        if (!err && response.statusCode == 200)
        {
            var $ = cheerio.load(body);
            var pagesList = $('ol.aui-nav').children();
            if(pagesList.length<1)
            {
                var numPages = 1;
            } else {
                var numPages = pagesList.length-2;
            }
            console.log(numPages);
            var pages = new Array(numPages),
                total = numPages*20,
                iterator = 0;

            async.eachSeries(pages, function(page, cb)
            {
                if(page>1)
                {
                    pages[iterator] = iterator;
                }else {
                    pages[iterator] = iterator*20;
                }
                iterator++;
                return cb();
            }, function(err){
                if(err) return cbNumPages(err);
                return cbNumPages(null, pages);
            });
        } else {
            return cbNumPages(err);
        }
    })
}

function funcTwo(pages, cbGetFiles) {
    var files = [];
    var limitDate = moment().tz('Europe/Madrid').subtract(330,'days').format();

    async.eachSeries(pages, function(page, cb)
    {
        request({
            url: 'any-url'+page,
            qs: {},
            method: 'GET',
            headers: {
                'Authorization' : 'any-auth'
            }
        }, (err, response, body) => {
            if(!err && response.statusCode == 200)
            {
                var $ = cheerio.load(body);
                var rows = $('tr[id^=\'attachment-\']');
                async.eachLimit(rows, 1, function(row, inner_cb)
                {
                    var id = row.attribs['id'];
                    var file = row.attribs['data-attachment-filename'];
                    var author = $(row).children('.creator').text().trim();
                    var created = $(row).children('.created-date').text().trim();
                        created = moment.tz(created, 'MMM D, YYYY', 'Europe/Madrid').format();
                    var urlFile = 'simple-file' + $(row).children('.filename-column').children('.filename').attr('href');
                    var extension = row.attribs['data-attachment-filename'].split('.');
                        extension = extension[extension.length-1];
                    if(created<limitDate && validExtensions.indexOf(extension)>-1)
                    {
                        var f = '{ "id": "' + id + '",';
                            f += ' "file": "' + file + '",';
                            f += ' "url": "' + urlFile + '",';
                            f += ' "author": "' + author + '",';
                            f += ' "modified": "' + created + '" }';
                        files.push(JSON.parse(f));
                    }
                    return inner_cb();
                }, (err) => {
                    if(err) return cbGetFiles(err);
                });
                return cb();
            } else {
                return cb(err);
            }
        });
    }, function(err){
        if(err){
            return cbGetFiles(err);
        } else {
            return cbGetFiles(null, files);
        }
    });
}

function funcThree(files, cbGetAutors) {
    var filesFinal = {};
    for(var f in files)
    {
        if(!filesFinal[files[f].author])
        {
            var ff = {};
            for(var i in files)
            {
                if(files[i].author === files[f].author)
                {
                    ff[files[i].file] = files[i].url;
                }
            }
            filesFinal[files[f].author] = ff;
        }
    }
    return cbGetAutors(null, JSON.parse(JSON.stringify(filesFinal)));
}

function funcFour(filesFinal, cbSendEmail) {
    var authors = Object.keys(filesFinal);
    async.eachSeries(authors, function(author, cb)
    {
        var name = author.split(' ');

        var email = '[email protected]';
        var msg = '<p>Hi ' + author + ',</p><p>how is it going:</p><p>';
        for(var a in Object.keys(filesFinal[author]))
        {
            msg += '<p style="margin-left:20px"> '+ICON_DOC+' <a href="';
            msg += filesFinal[author][Object.keys(filesFinal[author])[a]]+'">'+Object.keys(filesFinal[author])[a]+'</a></p>';
        }
        msg += '</p></p><p><b>NOTE: This is a no-reply address.</b></p><p>Have a nice day! '+ICON_MONKEY+'</p>';

        var message = {
            text:    msg,
            from:    '[email protected]',
            to:      email,
            bcc:     '',
            subject: 'Sample subject',
            attachment: [{data: msg, alternative: true}]
        };

        serverEmail.send(message, function(err, message)
        {
            if(err)
            {
                return cb(err);
            } else {
                console.log(message);
                return cb();
            }
        });

    }, function(err){
        if(err) return cbSendEmail(err);
        return cbSendEmail();
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

回调不是使用 nodejs 进行异步操作的函数

来自分类Dev

Nodejs - 异步 - 并行 - 限制回调不是函数

来自分类Dev

回调不是函数错误 [Nodejs]

来自分类Dev

Nodejs异步回调问题

来自分类Dev

TypeError:回调不是nodeJS中带有asyncJS的函数

来自分类Dev

TypeError:回调不是nodeJS中带有asyncJS的函数

来自分类Dev

NodeJS异步:已经调用了回调?

来自分类Dev

NodeJS异步:已经调用了回调?

来自分类Dev

NodeJS异步回调不成功?

来自分类Dev

NodeJS异步大数据集回调

来自分类Dev

NodeJS 异步:回调已被调用?

来自分类Dev

异步-Nodejs doUntil进入瀑布

来自分类Dev

了解 NodeJS 中的回调函数

来自分类Dev

nodejs 在回调函数中绑定对象

来自分类Dev

无法从 NodeJS 的回调函数返回数据

来自分类Dev

回调函数在 NodeJS 中是如何工作的?

来自分类Dev

承诺异步瀑布回调方法可能吗?

来自分类Dev

NodeJS回调

来自分类Dev

nodejs,dynamo表获取操作回调或异步

来自分类Dev

NodeJS异步-将参数传递给回调

来自分类Dev

NodeJS获得异步返回值(回调)

来自分类Dev

Nodejs异步调用排水回调完成之前

来自分类Dev

函数内的nodejs回调函数->如何返回结果

来自分类Dev

节点异步瀑布回调已被调用

来自分类Dev

节点异步瀑布回调已被调用

来自分类Dev

FIREBASE 警告:用户回调引发了异常。TypeError:req.next 不是带有 nodejs 的 firebase 中的函数

来自分类Dev

回调中的 Nodejs Mysql 回调

来自分类Dev

用户定义的函数,在nodejs中具有回调

来自分类Dev

将NodeJS回调从导出的函数传递到视图