node在操作mongodb的时候怎么才算充分体现异步特性?

用的中间件是mongoose
要怎么样的操作数据库才能算是异步的?异步的话要怎么确定是否入库成功?

比如删除某一条

var User = require("./mongouser.js");
var wherestr = {'username' : '什么鬼'};
    
    User.remove(wherestr, function(err, res){
        if (err) {
            console.log("Error:" + err);
        }
        else {
           // console.log("Res:" + res);
           res.send("删除成功");
            //删除成功在这里,这样就有了阻塞,如果数据库因为某些原因没有响应,那么就一直停在这里了.
        }
    })
     res.send("删除成功");
    //如果删除成功放在这。。虽然不会阻塞了,但是如果因为某些原因没有入库成功- -,卧槽

想过promise async但是实质上好像还是一个回调的语法糖

阅读 2.8k
4 个回答
function removeUser (wherestr) {
    return new Promise((resolve, reject) => {
       setTimeout(() => {
         reject('超时了')
       },5000)
       User.remove(wherestr, function(err, res){
        if (err) {
            reject(err)
        }
        else {
           resolve(res)
        }
    })
}
async function run () {
    let res
    try {
      res = await removeUser({'username' : '什么鬼'})
    } catch(err) {
      console.log(err)
    }
}
run()

随便写写,将就着看看

http://mongoosejs.com/docs/ap...
remove可以看作是实例方法...你需要先实例化一个model.
如果用User这个Model操作应该是用findOneAndRemove:http://mongoosejs.com/docs/ap...
异步就是把所有要做的都提前写好
你可以什么都不做,一直等到数据回来,再进行操作(阻塞)
也可以把当数据数据回来了,怎么处理数据,怎么处理异常全部想好,然后用回调函数处理,
问题当然就是异步中的异步了...比较难看,所以有了各种库...但是你遇到的问题跟这些无关

User.findOne(whereStr, function(e, u) {
    if(e)
        ....;
    else {
        console.log(u);
        u.remove(function(e, u) {
            if(e)
                //删除失败
            else {
                //成功
                User.findOne(whereStr, function(e, u) {
                    console.log(u) //=> []
                })
            }
        })
    }
})

首先你把res.send("删除成功");放在外边是肯定不对的。

新手上路,请多包涵

async.parallel([

function(cb){
    db.collection("A").find({//条件A}).toArray(function(docs){
        //回调A
    })
},
function(cb){
    db.collection("B").find({//条件B}).toArray(function(docs){
        //回调B
    })
},
function(cb){
    db.collection("C").find({//条件C}).toArray(function(docs){
        //回调C
    })
}

],function(err,result){

//A,B,C处理结果

})

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题