同时执行查询并在所有查询准备好后返回

时间:2016-06-15 13:14:56

标签: mysql node.js express sequelize.js

我发现自己经常遇到需要在数据库中查询多个模型才发送它们以HTML格式呈现的情况。我所做的是

ModelA.findById({ ... }).then(function(modelA) {
    ModelB.findById({ ... }).then(function(modelB) {
        return both modelA and modelB
    });
});

这有几个问题:

  1. 第二个查询在第一个查询返回后执行。因为他们不相互依赖,这只会增加延迟。查询应该同时执行。
  2. 有多个查询,这会变得非常混乱。想象一下以下
  3. ModelA.findById({ ... }).then(function(modelA) {
        ModelB.findById({ ... }).then(function(modelB) {
            ModelC.findById({ ... }).then(function(modelC) {
                ModelD.findById({ ... }).then(function(modelD) {
                    ModelE.findById({ ... }).then(function(modelE) {
                        ModelF.findById({ ... }).then(function(modelF) {
                            return all models
                        });
                    });
                });
            });
        });
    });
    

    如何同时执行查询并仅在执行完所有查询后继续页面呈现?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用Promise.all,所有查询都将同时执行,但是当您的所有查询都返回时,then函数将会执行。

var queries = [
    ModelA.findById({...}),
    ModelB.findById({...}),
    ModelC.findById({...}),
    ModelD.findById({...}),
    ModelE.findById({...}),
    ModelF.findById({...})
];

Promise.all(queries).then(function (results) {
    console.log(results); // [modelA, modelB ...]
});

您还应该阅读有关javascript承诺的内容。