javascript - .then 中嵌套的 Promise 在第一个 Promise Node 之前运行

标签 javascript node.js mongodb promise es6-promise

我的程序遇到了问题,当时我在 promise 的 .then 中运行 promise ,但它在第一个 promise 之前运行第二个 promise 。这不是我想要的,因为它依赖于第一个 promise 的工作。这是我的代码(console.logs 是随机的,但我只是当场想出一些东西来检查运行时)

new Promise((resolve, reject) => {
    for (i = 0; i < 10; i++) {

        var query = {
            class: result[`class${i}`]
        };
        dbo.collection("homeworks").find(query).toArray(function(err, result) {
            if (err) throw err;
            for (i = 0; i < result.length; i++) {
                current = current + 1;
                console.log(current)
                allhomework[current] = result[i];
                console.log(allhomework[current])
            }
            db.close();

        });
    }
    console.log("HOLA");
    resolve(allhomework);
})
.then((allhomework) => {
    console.log("HOLA MIS AMIGOS")
    new Promise((resolve, reject) => {
        console.log("v");
        for (i = 0; i < 10; i++) {
            console.log("uaefshiudvhofdh")
            console.log(allhomework[1]);
        }
        resolve();
    }).then(() => {
        response.render('index', {
            username: req.session.user,
            homeworks: allhomework
        });
    })

})
.catch(console.log)

最佳答案

解决这个问题的最佳方法是使用数据库的 Promise 接口(interface),并使用 Promise.all() 来跟踪循环中所有异步数据库操作何时完成。但是,如果您想使用现有循环手动对其进行编码,则只需在它们全部完成时保留一个计数器即可。

new Promise((resolve, reject) => {
    let cntr = 10;
    for (let i = 0; i < 10; i++) {

        var query = {
            class: result[`class${i}`]
        };
        dbo.collection("homeworks").find(query).toArray(function(err, result) {
            if (err) {
                db.close();
                return reject(err);
            }
            for (let i = 0; i < result.length; i++) {
                current = current + 1;
                console.log(current)
                allhomework[current] = result[i];
                console.log(allhomework[current])
            }
            --cntr;
            if (cntr === 0) {
               db.close();
               resolve(allHomework);
            }
        });
    }
    console.log("HOLA");
});

有关此代码的其他注释:

我还想知道为什么在外循环中间有一个db.close()。我认为这会引起问题。

我还在您的 if (err) 检查中添加了 reject(err)

您与 i 变量存在循环冲突。为每个字母添加 let 以使它们分开或将其中一个更改为不同的字母。

<小时/>

这是在数据库中使用 Promise 接口(interface)的版本。我能够完全摆脱内部循环,只让 Promise 为我们收集所有结果。 Monbodb 的 .toArray() 返回一个 promise ,如果您不向其传递回调,则该 promise 将解析查询结果。我们可以将其与 Promise.all() 一起使用来按顺序收集所有结果,并在它们全部完成时告诉我们:

let promises = [];
for (let i = 0; i < 10; i++) {
    let query = {
        class: result[`class${i}`]
    };
    promises.push(dbo.collection("homeworks").find(query).toArray());
}
Promise.all(promises).then(allResults => {
    // flatten the results into all one array - promises will have kept them in proper order
    db.close();
    let results = [].concat(...allResults);
    // now do whatever you want with the final array of results
}).catch(err => {
    db.close();
    // handle error here
});

关于javascript - .then 中嵌套的 Promise 在第一个 Promise Node 之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48478844/

相关文章:

javascript - 重写indexOf()以从null调用

javascript - 如何等待 Canvas 上的点击

javascript - 具有特定锚定文本值的 AngularJS 搜索/查找/过滤 div

java - 使用 Hibernate 定义两种数据源 - 一种是关系型数据源,一种是 NoSQL 数据源

javascript - 将 javascript 生成的文档的字符集更改为 utf8

node.js - 为什么在 Express Node JS 中同时请求相同路由时集群不起作用?

node.js - Nodemailer Gmail 副本

ruby-on-rails - 如何使用 socket.io 识别/验证用户

java - 编译简单的 MongoDB + Java 示例

mongodb - 外部数据库服务(mongohq等)的优缺点