gpt4 book ai didi

arrays - NodeJS - 使用 Q 对对象数组执行异步操作,但有所不同

转载 作者:太空宇宙 更新时间:2023-11-04 02:32:28 25 4
gpt4 key购买 nike

我也是 Q 和 Promise 的新手,几天来一直在解决这个问题。我正在尝试迭代可变长度的 RECORDS 数组,使用异步调用中每条记录的 ID 来检索 OBJECT(在来自 redis 的情况下)。

不同的是,我需要将 RECORD 中的一些数据与检索到的 OBJECT 中的一些数据组合起来,从这些组合对象创建一个新数组,然后返回该数组。

我的失败代码如下所示:

arrayOfThingRecords = [... an array of small objects, each with a 'thingid'...];
arrayOfCombinedObjects = [];

arrayOfThingRecords.forEach(function(thingRecord) {

Q.ninvoke(redisClient, "HGETALL", thingRecord.thingid)
.then((function (thingObject) {
combinedThingObject = {
thingStuffFromRecord: thingRecord.thingStuffFromRecord,
thingStuffFromObject: thingObject.thingStuffFromObject
};
}).done(function () {
arrayOfCombinedObjects.push(combinedThingObject)
}); //

}; // Then do stuff with arrayOfThingObjects...

我知道使用 forEach 是错误的,因为它在 promise 返回之前执行。我一直在尝试使用 Q.all()Q.settled(),并构建一系列 promise 等,但我完全感到困惑,并怀疑/希望我可能会让这件事变得比需要的更困难。

最佳答案

不要使用手动填充的全局arrayOfCombinedObjects = []。始终用相应操作的结果值来兑现您的 promise 。例如,

Q.ninvoke(redisClient, "HGETALL", thingRecord.thingid)
.then(function(thingObject) {
return {
// ^^^^^^
thingStuffFromRecord: thingRecord.thingStuffFromRecord,
thingStuffFromObject: thingObject.thingStuffFromObject
};
});

成为该对象的 promise 。

现在,使用Q.all是正确的方法。它需要一个 promise 数组,并将它们组合成一个包含所有结果的数组的 promise 。因此,我们需要构建一个 Promise 数组——上面这些对象的 Promise 数组。您可以使用 forEach 迭代和 push 将数组放在一起,但使用 map容易得多。然后就变成了

var arrayOfThingRecords = [... an array of small objects, each with a 'thingid'...];
var arrayOfPromises = arrayOfThingRecords.map(function(thingRecord) {
return Q.ninvoke(redisClient, "HGETALL", thingRecord.thingid)
// ^^^^^^ let the promise be part of the new array
.then(function(thingObject) {
return {
thingStuffFromRecord: thingRecord.thingStuffFromRecord,
thingStuffFromObject: thingObject.thingStuffFromObject
};
});
});
Q.all(arrayOfPromises).then(function(arrayOfCombinedObjects) {
// Then do stuff with arrayOfThingObjects...
});

关于arrays - NodeJS - 使用 Q 对对象数组执行异步操作,但有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25372896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com