让我们从使用诺言的一般规则开始:
每个执行异步 *** 作的函数都必须返回一个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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)