我有一个接受函数作为回调参数的方法。外部方法和回调函数都返回我收集到数组的 promise ,等待它们被 Q.all 解析。
function eval() {
var colReadPromisses = [];
config.mongodb.colls.forEach(function (collName) {
var outer = mongo.readCollection(collName,
function (jsonData) {
var prom = es.pushItemToES(jsonData, esIndexName, collName, i);
colReadPromisses.push(prom);
});
colReadPromisses.push(outer);
});
return Q.all(colReadPromisses);
}
现在,内部回调方法被调用了很多次,并且需要一些时间来处理所有这些方法。在处理它们时,从“readCollection”方法返回的 promise 变得“未定义”,导致“Q.all(colReadPromisses);”解决。
所以我的两个问题是为什么nodejs会失去对“readCollection”方法返回的 promise 的跟踪以及如何避免这种情况?
感谢您的回复!
最佳答案
我假设您想在返回的 Promise 中获取所有 readCollection 和 PushItemToES 的结果
function eval() {
return Q.all(config.mongodb.colls.map(function (collName) {
var pushPromisses = [mongo.readCollection(collName, function (jsonData) {
pushPromisses.push(es.pushItemToES(jsonData, esIndexName, collName, i));
})];
return pushPromisses[0] // once the outer promise resolves
.then(function() {
return Q.all(pushPromisses); // wait for them all (including the outer)
});
}));
}
返回的 Promise 解析后,将解析为二维数组
-
[0][0]
将是mongo.readCollection(colls[0])
的结果 -
[0][1..n]
将是每个pushItemToES
的结果来自readCollection(colls[0])
-
[1][0] will be the result of the
mongo.readCollection(colls[1])` -
[1][1..n]
将是每个pushItemToES
的结果来自readCollection(colls[1])
等等
如果你不需要 mongo.readCollection
的结果在返回的 promise 中
function eval() {
return Q.all(config.mongodb.colls.map(function (collName) {
var pushPromisses = [];
return mongo.readCollection(collName, function (jsonData) {
pushPromisses.push(es.pushItemToES(jsonData, esIndexName, collName, i));
}).then(function() {
return Q.all(pushPromisses);
});
}));
}
在这种情况下,返回的 Promise 仍然是二维的,但只有 pushItemToES
的结果。
-
[0][0..n]
将是每个pushItemToES
的结果来自readCollection(colls[0])
-
[1][0..n]
将是每个pushItemToES
的结果来自readCollection(colls[1])
我在已解决的 promise 中看不到任何围绕二维数组的方法 - 因为 es.pushItemToES
不被称为“已知”(至少不是提前)次数
关于javascript - 从方法返回的 Promise 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35479224/