javascript - 从方法返回的 Promise 未定义

标签 javascript node.js promise

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

相关文章:

javascript - 从数组中删除单个项目或数组的函数 - javascript

node.js - Step.js 和使用 CoffeeScript 的异步控制流

javascript - Nodejs MySQL : Accessing variable in another route

javascript - 如何将回调样本转换为延迟对象?

javascript - 如何从云代码模块返回 Parse promise?

javascript - 如何只加载帖子摘要而不加载整页

javascript - 使用 javaScript 函数 onclick div 替换 HTML 内容?

javascript - KendoEditor 将焦点设置在文本末尾

node.js - 使用 nodejs 时保护远程资源

javascript - 从 API(对象)创建 Promise