nodejs如何获得从异步回调的返回值?

    users.find({uname: this.uname, passwd: this.passwd}, (err, docs) => {
        if (docs.length === 0) {
            return true;
        } else {
            return false;
        }
    });
    
    如题 想在数据库中匹配帐号和密码 然后返回一个值
    但是显然捕捉不到 能否捕捉到异步执行完后的值
    或者 同步怎么写??
阅读 7k
2 个回答
  • 没搞明白为啥要捕捉异步执行完后的值,你把你需要用到这个执行结果的业务逻辑,放到callback里面不久可以了么?

  • Promise能不能帮到你呢?

const find = (uname, passwd) => new Promise((resolve, reject) => {
  users.find({ uname, passwd }, (err, docs) => {
    if(err) return reject(err)
    if(docs.length === 0) return resolve(true)
    resolve(false)
  })
})

find(this.uname, this.passwd).then(result => {
    // 获取到异步执行完后的值的业务代码
    console.log(result)
}).catch(err => console.error(err))
  • async/await Promise的优雅版

const isExist = async (uname, passwd) => {
    try{
        const result = await find({ uname, passwd }) // result is true of false
        // 获取到异步执行后的代码的业务逻辑 
    } catch(e) {
        console.error(e)
    }     
}
  • Generator

  • EventEmitter

写不下去了,我还是没搞懂你为啥要捕捉异步执行完后的值,那我为啥还要回答呢,哎!!好吧!理解不对的话就忽略。

find如果从数据库匹配到了用户名和密码的话,返回的doc应该会将匹配项包装成数组吧,那么它的length应该不会是0,如果匹配不到才是0,因为返回的doc是空数组。我用mongoose的find的时候就得出这样的结论,不知题主所用的是不是也是如此。

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