当前位置: 首页 > 面试题库 >

Node.js:执行多个异步操作然后执行其他操作的最佳方法?

百里承业
2023-03-14
问题内容

在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。

我在forEach需要访问和解析结果的URI数组上使用标准构造。

码:

var articles;

feedsToFetch.forEach(function (feedUri)
{   
        feed(feedUri, function(err, feedArticles) 
        {
            if (err)
            {
                throw err;
            }
            else
            {
                articles = articles.concat(feedArticles);
            }
        });
 });

 // Code I want to run once all feedUris have been visited

我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与feedsToFetch.length看起来很hacky
的次数相同时才继续。

所以我的问题是, 在node.js中处理这种情况的最佳方法什么

最好没有任何形式的阻塞!(我仍然希望那飞快的速度)。是承诺还是其他?

谢谢,丹尼


问题答案:

无黑客解决方案

承诺将包含在下一个JavaScript版本中

流行的Promise库为您提供了.all()一种用于这种确切用例的方法(等待一堆异步调用完成,然后执行其他操作)。这是您的方案的完美匹配

蓝鸟还具有.map(),可以接受一组值并将其用于启动Promise链。

这是使用Bluebird的示例.map()

var Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));

function processAllFeeds(feedsToFetch) {    
    return Promise.map(feedsToFetch, function(feed){ 
        // I renamed your 'feed' fn to 'processFeed'
        return processFeed(feed) 
    })
    .then(function(articles){
        // 'articles' is now an array w/ results of all 'processFeed' calls
        // do something with all the results...
    })
    .catch(function(e){
        // feed server was down, etc
    })
}

function processFeed(feed) { 
    // use the promisified version of 'get'
    return request.getAsync(feed.url)... 
}

还要注意,您无需在此处使用闭包来累积结果。

在蓝鸟API文档都写得很好过,有很多的例子,所以它可以更容易回升。

一旦我了解了Promise模式,它就会使生活变得更加轻松。我不能推荐它。

另外,这是 一篇很棒的文章, 介绍了使用promise,async模块和其他方法处理异步函数的不同方法

希望这可以帮助!



 类似资料:
  • Redisson 支持对每个操作自动重试的策略并且在每次尝试期会尝试发送命令。 重试策略由设置项 retryAttempts (默认为 3) 和 retryInterval (默认为 1000 ms) 来控制。 每次尝试会在 retryInterval 时间间隔后执行。 Redisson 实例和 Redisson 对象都是完全线程安全的。 带有同步/异步方法的 Redisson 对象可通过 Red

  • 我有一个带有Vaadin集成(v14)的Spring Boot项目。我希望我的应用程序做一些后台操作,并在基于Vaadin的前端上表示结果。为此,我有一个视图,它是用Vaadin Designer(.js)生成的聚合物模板,并连接到Java companion类。在这个视图中,我只是简单地添加了一个用以下监听器初始化的按钮: 我正试图访问文档中所说的UI。然而,当它被执行时,它只到达第一个“等待”

  • 在过去的几天里,测试我情绪的问题是,尽管我的ESP8266芯片完全能够在while循环中通过parsePacket获取数据包,但当我既想监听传入的数据包,又想让我的ESP8266读取传感器并通过wifi发送这些数据包时,它完全忽略了这些。 所以我删掉了所有与传感器有关的内容,并在下面粘贴了代码,但下面是正在发生的事情。 在Setup()中,ESP设置wifi、SoftAP节点、UDP并进行配置 然

  • 本文向大家介绍async/await让异步操作同步执行的方法详解,包括了async/await让异步操作同步执行的方法详解的使用技巧和注意事项,需要的朋友参考一下 一.前言 我们经常会遇到这样的麻烦事,多个函数按顺序执行,返回结果却不是我们预期的顺序,原因一般是由于异步操作引起的,所以呢,我们需要一种解决方案来处理这种问题,从而使得异步操作按照同步的方式来执行,这样我们就可以控制异步操作输出结果的

  • 主要内容:SELECT,WHERE,GroupBy,LIMIT我们知道,使用 SQL 语句能够完成对 table 的增删改查操作,Pandas 同样也可以实现 SQL 语句的基本功能。本节主要讲解 Pandas 如何执行 SQL 操作。 首先加载一个某连锁咖啡厅地址分布的数据集,通过该数据集对本节内容进行讲解。 输出结果如下: SELECT 在 SQL 中,SELECT 查询语句使用 把要查询的每个字段分开,当然您也可以使用 来选择所有的字段。如下所示: 对

  • 一个压缩操作被执行,一直等到结束或按下“取消”按钮立即中断它。当压缩或解压时,您也可以按下“后台操作”和“暂停”按钮。“后台操作”把 WinRAR 最小化到任务栏中。当完成当前操作后或您单击任务栏上的小 WinRAR 图标它会自动复原。“暂停”按钮暂停当前操作,您需要按下“继续”来恢复它。 不管在压缩还是解压时,命令窗口上部的进度条都会显示当前文件的处理进度。 当压缩和某些解压操作期间,指示总操作