返回从循环中调用的数据库查询中检索到的数据时出现问题

返回从循环中调用的数据库查询中检索到的数据时出现问题,第1张

返回从循环中调用的数据库查询中检索到的数据时出现问题

让我们从使用诺言的一般规则开始:

每个执行异步 *** 作的函数都必须返回一个promise

您要使用哪些功能?是

getPrayerInCat
forEach
回调和
Prayer.find

嗯,

Prayer.find
返回promise,它是一个库函数,因此我们无法对其进行修改。规则2起作用:

为每个不创建的函数创建一个立即包装

在我们的情况下,使用[Q的节点接口助手]很容易:

var find = Q.nbind(Prayer.find, Prayer);

现在,我们只有承诺,而不再需要任何延期。第三条规则起作用:

所有与异步结果有关的事情都会进入

.then
回调

…并返回结果。地狱,如果“某物”是异步的,那么结果甚至是一个承诺!这样,我们可以编写完整的回调函数:

function getPrayerCount(data2) {    var id = data2.id;    return find({prayerCat:id})//  ^^^^^^ Rule 1    .then(function(prayer) {//  ^^^^^ Rule 3        if (!prayer) data2.prayersCount = 0;        else data2.prayersCount = prayer.length;        return data2;//      ^^^^^^ Rule 3b    });}

现在,我们有了一些更复杂的东西:一个循环。反复调用

getPrayerCount()
将为我们带来多个承诺,其异步任务并行运行并以未知顺序解析。我们希望等待所有这些,例如,当每个任务完成时,获得可以解决所有结果的承诺。

对于此类复杂的任务,请勿尝试提出自己的解决方案:

检查您库的API

在那里,我们发现

Q.all
,它正是这样做的。
getPrayerInCat
现在写作变得轻而易举:

function getPrayerInCat(data) {    var promises = data.map(getPrayerCount); // don't use forEach, we get something back    return Q.all(promises);//  ^^^^^^ Rule 1}

如果我们需要对

Q.all
解析数组进行任何 *** 作,只需应用规则3。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5021938.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存