无法确定返回值的承诺 - NodeJS

时间:2021-07-08 23:12:41

标签: node.js mongodb mongoose

在搜索了无数帖子后,我不明白为什么在等待后我仍然收到一个 Promise 未决。下面的代码应该解释它,但我正在尝试提取列/模式最大值的 MongoDB 查询。函数中的 console.log 给了我正确的时间戳,但我试图将它从内部作用域和函数传递给另一个函数。

这是纯 NodeJS,只导入了 MongoDB。这可以在没有任何外部包的情况下完成吗?

    export async function getMaxDate() {
        var time = MongoClient.connect(url, { useUnifiedTopology: true }, function (err, db) {
            if (err)
                throw err;
            var dbo = db.db(getDB);
            dbo.collection(getColl)
                .find()
                .limit(1)
                .sort({ 'timestamp': -1 })
                .toArray(function (err, result) {
                    if (err)
                        throw err;
                    time = result[0].time; // THIS IS GIVING THE CORRECT VALUE
                    console.log(time)
                    db.close();
                });

        });
        return time    
    }

    export async function getMax() {
        var block = await getMaxDate();
        return block
    } 

    var t = getMax();
    console.log(t); // THIS IS GIVE ME A PROMISE PENDING

1 个答案:

答案 0 :(得分:0)

getMax() 返回一个 promise,你必须等待它。

var t = await getMax()

还有 getMaxDate 使用您想要承诺的异步回调:

export async function getMaxDate() {
  return new Promise((resolve,reject) => {  
    MongoClient.connect(url, { useUnifiedTopology: true }, function (err, db) {
      if (err)
        return reject(err);
      var dbo = db.db(getDB);
      dbo.collection(getColl)
        .find()
        .limit(1)
        .sort({ 'timestamp': -1 })
        .toArray(function (err, result) {
          if(err)
            reject(err);
          else {
            let time = result[0].time; // THIS IS GIVING THE CORRECT VALUE
            console.log(time)
            db.close();
            resolve(time);
          }
        });
    })
  });
}

作为参考,这里A和B是一样的:

async function A(x) {
  if(x)
    throw new Error('foo');
  else
    return 'bar';
}
function B(x) {
  return new Promise((resolve,reject)=>{
    if(x)
      reject(new Error('foo'));
    else
      resolve('bar');
  });
}

Promises 先出现,然后引入了 async/await 符号,使常见的 Promise 编码实践更容易

您可以交替使用 A 和 B:

async function example1() {
  try { 
    await A(1);
    await B(0);
  }
  catch(err) {
    console.log('got error from A');
  }
}
async function example2() {
  return A(0).then(()=>B(1)).catch((err)=>{
    console.log('got error from B');
  })
}
相关问题