我有一个接受函数作为回调参数的方法。外部方法和回调函数都返回我收集到数组的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”方法返回的承诺被“未定义”,从而导致“ Q.all(colReadPromisses);”。解决。
因此,我的两个问题是,为什么nodejs无法跟踪'readCollection'方法返回的承诺,如何避免这种情况?
感谢您的回应!
最佳答案
我假设您想获取返回的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])
的结果等等
如果您不需要返回的promise中的
mongo.readCollection
结果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/