使用javascript承诺与Mongoose查询

时间:2018-03-30 15:11:07

标签: javascript asynchronous mongoose promise

通常,如果我要运行多个mongoose查询,我会使用内置的promise来将它们链接在一起。在这种情况下,用户选择要搜索的模式。这可能是其中之一或两者兼而有之。以下示例使用post数据来定义要搜索的模式,如果一个模式为false,则应继续通过promise链。现在,在查询之前调用最终的承诺。

我的快速控制器中的示例:

app.post('/custom-search', function (req, res) {
     var single = false
     var multi = false


      if(req.body.single){
          var single = true
      }

      if(req.body.multi){
          var multi = true
      }

    var promise = new Promise(function (resolve, reject) {
        if(multi){
            multiSchema.find({}, function (err, result) {
                if(!err){
                    console.log(result);
                    resolve()
                }
            })
        }else{
            resolve()
        }
    }).then(function (value) {
        if(single){
            singleSchema.find({}, function (err, result) {
                if(!err){
                    console.log(result);
                    resolve()
                }
            })
        }else{
            resolve()
        }
    }).then(function (value) {
        console.log("done");
    })
})

});

输出:

>done
>[singleResults]
>[multiResults]

完成应该打印最后,这是第一个问题。

1 个答案:

答案 0 :(得分:0)

就像我们讨论的那样,很少有东西需要清理。首先实际使用并返回承诺,使其正常工作,其次,在您的第一个.then()内创建一个小承诺,以解决并拒绝您的单个条件语句。第三,处理/捕捉承诺。

我写了一段代码的伪版本来说明我的观点,希望它可能有很好用。

app.get('/custom-search', function (req, res) {
        // Manipulating values to test responses
        var single = false;
        var multi = true;

        var promise = new Promise(function (resolve, reject) {
            if (multi) {
                setTimeout(function () {
                    resolve('MULTI RESOLVED!');
                }, 3000);
            } else {
                reject('MULTI REJECTED!');
            }
        })
            .then(function (value) {
                new Promise(function (resolve, reject) {
                    if (single) {
                        setTimeout(function () {
                            resolve('SINGLE RESOLVED!');
                        }, 3000);
                    } else {
                        reject('SINGLE REJECTED!');
                    }
                })
                    .catch(function (error) {
                        console.log('SINGLE ERROR!', error);
                    })
                    .then(function (value) {
                        console.log('SINGLE DONE', value);
                    });
            })
            .catch(function (error) {
                console.log('MULTI ERROR!', error);
            });
        return promise;
    });