Nodejs:如何编写高性能异步循环

发布于 2024-11-08 18:55:07 字数 406 浏览 0 评论 0原文

有一个initUrl,它是一篇包含下一篇博客的文章,并定义函数getNextUrl(url,callback(err, nextUrl)),想要获取下一个100个url。

在stormjs中(开发https://github.com/guileen/stormjs/issues/1 ),它写成

var url = initUrl;
for(var i=0; i<100; i++){
  url = getNextUrl(url, _);
}
console.log(url);

但是最好的输出应该是什么,我想知道节点如何在没有第三个模块的情况下编写这段代码。

have a initUrl, its an article which contains next blog, and defind function getNextUrl(url, callback(err, nextUrl)), want to get the next 100th url.

In stormjs (developing https://github.com/guileen/stormjs/issues/1), it write as

var url = initUrl;
for(var i=0; i<100; i++){
  url = getNextUrl(url, _);
}
console.log(url);

but what the best output should be, I want to know how noders write this code without 3rd module.

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

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

发布评论

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

评论(1

浅笑轻吟梦一曲 2024-11-15 18:55:07
arr = [];
(function recurse(url, i) {
    getNextUrl(url, function(err, nextUrl) {
        if (!err) {
            arr.push(nextUrl);
            if (i < 100) recurse(nextUrl, i++);
        }
    });
}("", 0);

我将这种模式称为自举递归。

如果您希望它更简洁而不是高效,您可以使用一些 .bind 魔法。

(function recurse(i, err, url) {
    if (!err) arr.push(url);

    if (i < 100) getNextUrl(url, recurse.bind(null, ++i));
}(0, "trick it", url);
arr = [];
(function recurse(url, i) {
    getNextUrl(url, function(err, nextUrl) {
        if (!err) {
            arr.push(nextUrl);
            if (i < 100) recurse(nextUrl, i++);
        }
    });
}("", 0);

I call this pattern boot strapped recursion.

If you prefer it to be more concise rather then efficient you can use some .bind magic.

(function recurse(i, err, url) {
    if (!err) arr.push(url);

    if (i < 100) getNextUrl(url, recurse.bind(null, ++i));
}(0, "trick it", url);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文