我有一个接受函数作为回调参数的方法。外部方法和回调函数都返回我收集到数组的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/

10-11 17:19