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

是否有一个纯基于Promise的方法来映射/连接集合?

于嘉许
2023-03-14
问题内容

一般异步与Q

我正在学习Node.js的开发,并试图将我的大脑包在管理异步“回调地狱”的策略上。我研究的两个主要策略是Caolan
McMahon的async模块和Kris
Kowal的基于promise的Q模块。

像其他许多人一样,我仍在努力理解何时应该使用一个与另一个。但总的来讲,我发现承诺和基于Q-
代码要 稍微 更直观,所以我在这个方向被移动。

一般映射/连接集合

但是,我仍然停留在使用异步模块的功能来管理集合。来自Java和Python背景,在大多数情况下,当我使用集合时,逻辑如下所示:

  1. 初始化一个新的空集合,用于存储结果。
  2. 对旧集合执行一个for-each循环,对每个元素应用一些逻辑,然后将其结果推送到新的空集合中。
  3. 当for-each循环结束时,继续使用新集合。

在客户端JavaScript中,我已经习惯于使用jQuery的map()函数
…传递步骤2的逻辑,并获取步骤3的结果作为返回值。感觉就像相同的基本方法。

使用异步和Q映射/连接集合

节点端异步模块具有类似的map和concat函数,但是它们不会在原始范围级别返回连接的结果。您必须改为进入回调地狱才能使用结果。例:

var deferred = Q.defer();

...

var entries = [???]; // some array of objects with "id" attributes

async.concat(entries, function (entry, callback) {
    callback(null, entry.id);
}, function (err, ids) {
    // We now have the "ids" array, holding the "id" attributes of all items in the "entries" array.
    ...
    // Optionaly, perhaps do some sorting or other post-processing on "ids".
    ...
    deferred.resolve(ids);
});

...

return deferred.promise;

由于我的其他函数正在基于promise,因此我将这段代码返回promise对象,以便可以轻松地将其包含在then()链中。

我真的需要两者吗?

我正在努力阐明的最终问题是:在上述代码示例中,我真的需要异步
Q吗?我正在学习如何通常用Q样式的Promise链替换异步模块的控制流…但是它还没有“点击”我如何使用基于Promise的方法进行集合的映射或连接。另外,我想了解为什么不能这样做,或者为什么这不是一个好主意。

如果异步和Q在我在上面的示例中使用它们时希望一起工作,那就也可以了。但是,如果我可以单独使用Q,我宁愿不需要额外的库依赖项。

对不起,如果我遗漏了非常明显的东西。异步事件驱动模型是一个截然不同的世界,我的头还在游。


问题答案:

我真的需要两者吗?

不能。使用promises在集合上映射异步迭代器非常简单,但是它需要两个步骤而不是一个函数调用。首先,集合mapPED以承诺为并行迭代的阵列。然后,将这些承诺输入到Q.all映射集合的一个承诺中。与相比async,结果的顺序得到保证。

var entries = […]; // some array of objects with "id" attributes

var promises = entries.map(function(object) {
    return asyncPromiseReturingFunction(object);
}); // the anonymous wrapper might be omitted
return Q.all(promises);

对于concat,您必须附加一个

.then(function(results) {
     return Array.prototype.concat.apply([], results);
});


 类似资料:
  • 我正在学习ode.js开发,并试图让我的大脑围绕管理异步“回调地狱”的策略。我探索的两个主要策略是Caolan McMahon的异步模块和Kris Kowal的基于promise的Q模块。 像许多其他人一样,我仍然在努力理解什么时候应该使用一个和另一个。然而,一般来说,我发现promise和基于Q的代码更直观一些,所以我一直朝着这个方向前进。 但是,我仍然无法使用异步模块的函数来管理集合。来自Ja

  • 我有三种不同的解决方案(搜索引擎、nosql数据库和自行开发的语义索引应用程序)来存储文档。 我正在对所有不同的解决方案运行查询,并希望使用类似于SQL Join的方法合并它们。这意味着有时我需要在document_id上加入3个或更多不同的数据集。 你知道Hadoop上的Map Reduce或者类似的东西是不是解决这个问题的最好方法?这些数据集可以包含从1 document_id到100 000

  • 问题内容: 我正在寻找一个简单的基于进程的python并行映射,即一个函数 它将在不同进程上的[data]的每个元素上运行函数(嗯,在不同的内核上,但是AFAIK,在python中的不同内核上运行的唯一方法是启动多个解释器),并返回结果列表。 是否存在这样的东西?我想要一些 简单的 东西,所以一个简单的模块会很好。当然,如果不存在这样的东西,我会为一个大图书馆而定:-/ 问题答案: 我似乎您需要的

  • 我可以检查一个帐户是否是一个广告组的成员,但有没有办法告诉一个帐户是否属于一个OU?我想搜索由你而不是由广告组,我不确定如果这是可能的。下面是我如何搜索一个广告组。

  • 问题内容: 这两种流创建方法之间在性能或最佳实践方面是否存在显着差异? 编辑 多亏了Stack Community的回答,我可以为新读者添加一些问题的完整性补充: 许多人指出,IntStream方法定义为: 从根本上将问题重新定义为下列哪个更好的问题: 要么 问题答案: 是的,可以从缓存中检索某些实例的用法。 因此,您应该将该版本与(最好使用)一起使用,或者使用代替。请注意,实际上这是的简写。

  • 问题内容: 嗨,我的问题不是技术性的。我想知道hibernate5是否支持基于XML的实体映射。 我的要求如下: 我想要在Jersey- Hibernate上使用后端。我的前端是Android应用程序。我想将我的实体POJO保留在一个公共项目中,以便它们将由应用程序和服务器共享。Gson将序列化/反序列化双方。但是由于android应用程序不支持所有Java库进行编译,因此我不希望我的common