我目前正在努力处理承诺的控制流程(承诺新手!)。
我调用了返回一个数组对象的 Redis。然后,我遍历每个结果并回调 Redis 以获取一个值,并希望将这些填充到最终对象out
中。
out 对象永远不会被填充,我猜测 forEach 尚未完成:
(注意 Redis 客户端库默认返回基于 when.js 的承诺)
var out = {};
REDISCLIENT.keys("apikey:*")
.then(function (replies) {
replies.forEach(function (key, index) {
REDISCLIENT.get(key)
.then(function (value) {
out[key] = value;
})
.done(console.log(out));
});
})
.catch(console.log)
.done(console.log(out));
如何保证 forEach 循环是完整的?
我已经阅读了许多类似的帖子(我知道这是重复的)但是无法理解为什么内部的 done() 方法不包含完整的out
obj。
我猜我需要将 forEach 本身包装在一个承诺中?欣赏任何方向。
更新 1:非常感谢@David_Aurelio。我现在需要填充out
键和值。这是我的尝试:
GLOBAL.REDISCLIENT.keys("apikey:*")
.then(function (replies) {
return when.all(replies.map(function (key, index) {
return GLOBAL.REDISCLIENT.get(key)
.then(function (val) {
out[key] = val;
console.log(key, val);
});
}));
})
.catch(console.log)
.done(function (out) {console.log(out); });
内部 console.log 打印正确的键/值
key1 val1
key2 val2
最后完成的现在打印:
[ undefined, undefined ]