Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用相互依赖的可变数量的异步函数_Javascript_Node.js_Asynchronous_Callback - Fatal编程技术网

Javascript 调用相互依赖的可变数量的异步函数

Javascript 调用相互依赖的可变数量的异步函数,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我试图通过一个网站分页,在那里为了请求下一页,当前页面上的信息是必需的 function paginateSite(numPages, cb) { var stringToGetToNextPage = '' for (var i = 0; i < numPages; i++) { (function(i, stringToGetToNextPage) { request({ url: 'http://

我试图通过一个网站分页,在那里为了请求下一页,当前页面上的信息是必需的

function paginateSite(numPages, cb) {
    var stringToGetToNextPage = ''
    for (var i = 0; i < numPages; i++) {
        (function(i, stringToGetToNextPage) {
            request({
                url: 'http://website.com',
                qs: {
                    nextPage: stringToGetToNextPage
                }
            }, 
            function(err, res, body) {
                body_json = JSON.parse(body)
                console.log(body_json.stringToGetToNextPage)
            })
        })(i, stringToGetToNextPage)
    }
}
功能分页站点(numPages,cb){
变量stringToGetToNextPage=''
对于(变量i=0;i
正如您所见,我无法在匿名函数之外设置stringToGetToNextPage。我查阅了异步库文档,但没有找到任何解决问题的方法

有人遇到过这个问题吗?在这种情况下,异步范例似乎没有一个干净的解决方案


编辑:问题#2,有没有一种不需要递归就能做到这一点的方法?递归对于小例子来说是不错的,但是现在我有了一个stackoverflow案例,它可以在没有警告的情况下杀死程序(并消耗内存)

递归是实现这一点的方法

首先,提取一个函数来检索单个页面:

function requestPage(stringToGetToNextPage, callback) {
    request({
        url: 'http://website.com',
        qs: {
            nextPage: stringToGetToNextPage
        }
    }, function(err, res, body) {
        if (err) { callback(err); }
        else { callback(null, JSON.parse(body)); }
    });
}
然后,创建一个可以递归调用自身的函数,以获取每个后续页面:

function requestAllPages(stringToGetToNextPage, callback) {
    requestPage(stringToGetToNextPage, function (err, page) {
        if (err) { callback(err); }
        else if (page && page.stringToGetToNextPage) {
            requestAllPages(page.stringToGetToNextPage, callback);
        }
        else { callback(); }
    });
}
然后,开始这一切:

requestAllPages(null, function () {
    console.log('Done!');
});

编辑如果您确实想对特定数量的页面进行分页,而不是将其放在末尾,则只需对
requestAllPages
进行少量修改即可:

function requestPages(numPages, stringToGetToNextPage, callback) {
    if (numPages <= 0) { callback(); return; }

    requestPage(stringToGetToNextPage, function (err, page) {
        if (err) { callback(err); }
        else if (page && page.stringToGetToNextPage) {
            requestPages(numPages - 1, page.stringToGetToNextPage, callback);
        }
        else { callback(); }
    });
}

requestPages(20, null, function () {
    console.log('Done!');
});
函数请求页(numPages、stringToGetToNextPage、回调){

if(numPages递归是实现这一点的方法

首先,提取一个函数来检索单个页面:

function requestPage(stringToGetToNextPage, callback) {
    request({
        url: 'http://website.com',
        qs: {
            nextPage: stringToGetToNextPage
        }
    }, function(err, res, body) {
        if (err) { callback(err); }
        else { callback(null, JSON.parse(body)); }
    });
}
然后,创建一个可以递归调用自身的函数,以获取每个后续页面:

function requestAllPages(stringToGetToNextPage, callback) {
    requestPage(stringToGetToNextPage, function (err, page) {
        if (err) { callback(err); }
        else if (page && page.stringToGetToNextPage) {
            requestAllPages(page.stringToGetToNextPage, callback);
        }
        else { callback(); }
    });
}
然后,开始这一切:

requestAllPages(null, function () {
    console.log('Done!');
});

编辑如果您确实想对特定数量的页面进行分页,而不是将其放在末尾,则只需对
requestAllPages
进行少量修改即可:

function requestPages(numPages, stringToGetToNextPage, callback) {
    if (numPages <= 0) { callback(); return; }

    requestPage(stringToGetToNextPage, function (err, page) {
        if (err) { callback(err); }
        else if (page && page.stringToGetToNextPage) {
            requestPages(numPages - 1, page.stringToGetToNextPage, callback);
        }
        else { callback(); }
    });
}

requestPages(20, null, function () {
    console.log('Done!');
});
函数请求页(numPages、stringToGetToNextPage、回调){

如果(numPages写一个递归函数

function get_page(next_page_number, last_page_number, string_needed, callback) {

    request(
        {
            url: 'http://website.com',
            qs: {
                nextPage: string_needed
            }
        }, 
        function(err, res, body) {
            // NB: Bad variable name. `body` is JSON. `body_json` won't be.
            var body_json = JSON.parse(body);

            if (next_page_number == last_page_number) {
                callback(body_json);
            } else {
                get_page(
                    next_page_number + 1, 
                    last_page_number,
                    body_json.stringToGetToNextPage,
                    callback
                );
            }
        }
    );

}

get_page(1, 27, "", function (body_json) { console.log(body_json); });

编写一个递归函数

function get_page(next_page_number, last_page_number, string_needed, callback) {

    request(
        {
            url: 'http://website.com',
            qs: {
                nextPage: string_needed
            }
        }, 
        function(err, res, body) {
            // NB: Bad variable name. `body` is JSON. `body_json` won't be.
            var body_json = JSON.parse(body);

            if (next_page_number == last_page_number) {
                callback(body_json);
            } else {
                get_page(
                    next_page_number + 1, 
                    last_page_number,
                    body_json.stringToGetToNextPage,
                    callback
                );
            }
        }
    );

}

get_page(1, 27, "", function (body_json) { console.log(body_json); });

有没有一种方法可以在没有递归的情况下做到这一点?(参见编辑)有没有一种方法可以在没有递归的情况下做到这一点?(参见编辑)有没有一种方法可以在没有递归的情况下做到这一点?(参见编辑)@JacksonDarrow我想不出一种没有递归的方法来实现这一点,但是你对堆栈溢出和内存过度使用的担心是没有根据的。因为调用是异步的,它们不会共享同一个堆栈,而且我的代码编写方式是,在任何给定时间内存中每个函数最多应该有一个调用。是吗有没有一种不用递归就能做到这一点的方法?(参见编辑)@JacksonDarrow我想不出一种没有递归的方法来实现这一点,但是你对堆栈溢出和内存过度使用的担心是没有根据的。因为调用是异步的,它们不会共享同一个堆栈,而且我的代码编写方式是,在任何给定的时间,内存中每个函数最多应该有一个调用。