在搜索了无数帖子后,我不明白为什么在等待后我仍然收到一个 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
答案 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');
})
}