【问题标题】:Using javascript promises with Mongoose queries在 Mongoose 查询中使用 javascript Promise
【发布时间】:2018-09-09 15:18:12
【问题描述】:

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

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

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]

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

【问题讨论】:

  • 你为什么不包括解决?在你的承诺定义中?新的承诺(功能(拒绝){
  • @Hadouken Opps 我正在测试一些东西,并认为我已经回到了我的原始代码。我加进去了。
  • 我注意到你的代码的几件事。你为什么不回承诺?其次,在您的第一个 .then() 中,您使用的是无法访问的 resolve()。
  • 我猜你必须在你的第一个 .then() 回调中定义另一个承诺

标签: javascript asynchronous mongoose promise


【解决方案1】:

正如我们所讨论的,几乎没有什么需要清理的。首先,通过实际使用并返回 Promise 以使其正常工作,其次,在您的第一个 .then() 中创建一个 mini-promise 来解决和拒绝您的单个条件语句。第三,处理/捕捉承诺。

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

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;
    });

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2019-06-18
    • 2019-04-09
    • 2016-05-30
    • 2021-07-11
    • 2012-10-24
    • 1970-01-01
    • 2023-03-08
    • 2018-06-20
    相关资源
    最近更新 更多