当前位置: 首页 > 知识库问答 >
问题:

是否有一种纯粹基于promise的方法来映射/连接集合?

平元明
2023-03-14

我正在学习ode.js开发,并试图让我的大脑围绕管理异步“回调地狱”的策略。我探索的两个主要策略是Caolan McMahon的异步模块和Kris Kowal的基于promise的Q模块。

像许多其他人一样,我仍然在努力理解什么时候应该使用一个和另一个。然而,一般来说,我发现promise和基于Q的代码更直观一些,所以我一直朝着这个方向前进。

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

  1. 初始化一个新的空集合,在其中存储结果。

在客户端JavaScript中,我已经习惯于使用jQuery的map()函数。。。传入该步骤#2逻辑,并获取步骤#3结果作为返回值。感觉是一样的基本方法。

节点端异步模块具有类似的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对象,这样它就可以很容易地包含在一个然后()链中。

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

如果async和Q打算像我在上面的例子中使用的那样一起工作,那么就这样吧。但是,如果我可以干净地单独使用Q,我宁愿不需要额外的库依赖。

(抱歉,如果我错过了一些非常明显的东西。异步事件驱动模型是一个非常不同的世界,我的头还在游泳。)

共有1个答案

袁鸿雪
2023-03-14

我真的需要两者吗?

没有。在集合上映射异步迭代器非常简单,但它需要两个步骤,而不是一个函数调用。首先,将集合映射为并行迭代的promise数组。然后,这些promise被输入到Q. all中,为映射的集合做出一个promise。与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);
});
 类似资料:
  • 问题内容: 一般异步与Q 我正在学习Node.js的开发,并试图将我的大脑包在管理异步“回调地狱”的策略上。我研究的两个主要策略是Caolan McMahon的async模块和Kris Kowal的基于promise的Q模块。 像其他许多人一样,我仍在努力理解何时应该使用一个与另一个。但总的来讲,我发现承诺和基于Q- 代码要 稍微 更直观,所以我在这个方向被移动。 一般映射/连接集合 但是,我仍然

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

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

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

  • 问题内容: 我经常发现自己需要过滤a 或使用谓词来检查给定字段是否具有给定值。 比如说我有这个POJO: 我想根据的值过滤对象的: 是否会有一种方便的方法来为该方法生成谓词?我注意到有,但不符合需要。 我可以很容易地这样写: 并将其用作: 但我希望尽可能重用JDK中的现有方法。 问题答案: 没有内置的工厂方法,您可以通过查看JFC中的所有用法并查找“ …中返回谓词的方法” 来轻松检查。除了自身内部

  • 有没有Angular2的方法可以做到这一点,或者我只是使用老式的JavaScript?