【问题标题】:Promise not being executed using chained promises node.js不使用链式承诺 node.js 执行承诺
【发布时间】:2015-06-02 23:54:45
【问题描述】:

我在使用 node.js 时遇到了这个代码问题

显然以下承诺没有被执行:

return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}, function (err){
                        console.log(err);
                        res.status(400).end();
                    });  

这是函数的其余部分:

.post(function (req,res){
                var bloguers = db.collection('bloguers');
                var bloguer = req.body;
                console.log(bloguer.id);
                bloguers.findOne({id: bloguer.id}).then( function (respon){
                    if(respon != null){
                        console.log('dentro if');
                        return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}, function (err){
                            console.log(err);
                            res.status(400).end();
                        });
                    }
                    else{
                        return bloguers.insertOne(bloguer).then(function (r){

                        }, function (err) {
                            console.log(err);
                            res.status(400).end();
                        });
                    }
                }).then(function(r){
                    res.json(r);
                })
            });

如您所见,console.log('dentro if') 已执行,但 promise 没有执行。

【问题讨论】:

    标签: angularjs node.js


    【解决方案1】:

    如果replaceOne 确实返回了一个承诺,那么您可能不应该向它传递回调。

    改变这个:

    return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true}, function (err){
      console.log(err);
      res.status(400).end();
    });
    

    到这里:

    return bloguers.replaceOne({id: bloguer.id}, bloguer,{upsert:true})
      .then(function () {
        res.status(400).end();
      })
      .catch(function (err) {
        console.log(err);
      });
    

    我不熟悉您正在使用的 API(原生 MongoDB 驱动程序?),但如果 API 已经支持 Promise,那么如果它检测到您向它传递了回调,它可能不会返回 Promise。

    【讨论】:

    • 确实我正在使用 MongoDB 驱动程序,它确实返回了一个承诺。但是我尝试了您的代码,但仍然承诺正在执行注释(尝试将控制台日志放在 .then() 中。
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多