除非我记录承诺,否则为什么我的异步代码无法正常工作?
Why does my async code not work properly unless I log the promise?
我有一些异步代码可以调用 mongo 数据库和 inserts/fetches 项。当我在本地开发时,下面的代码工作正常。但是,当我将 mongoose 实例连接到 MongoDb Atlas 时,出现了问题。特别是,除非我 console.log 承诺,否则我的代码似乎无法正常工作,这对我来说毫无意义。例如,使用 console.log 语句,我的所有测试都按预期通过了。没有它,35 次测试失败...这是因为我期望 return 的承诺为空,而它应该 return 来自数据库的一些 JSON 对象。我的代码没有正确阻塞吗?
感觉就像我在和薛定谔的猫打交道...任何帮助将不胜感激。提前致谢。
下面是一个 promise/function 调用示例。然后我将它传递给 _executeQuery。我已经等待相关功能,所以我不认为这是因为我在某处遗漏了等待这个词。
async _inSomeAsyncFunction = () => {
const dbQueryPromise = this._dbModel.findById(_id, modelView).lean();
await this._executeQuery({ dbQueryPromise, isAccessPermitted: true })
}
_executeQuery 基本上是在用户有权限的情况下得到 promise 的结果。
private _executeQuery = async (props: {
isAccessPermitted: boolean;
dbQueryPromise: Promise<any>;
}): Promise<any> => {
const { isAccessPermitted, dbQueryPromise } = props;
if (!isAccessPermitted) {
throw new Error('Access denied.');
}
console.log(dbQueryPromise, 'promise'); // without this line, dbQueryResult would be null...
const dbQueryResult = await dbQueryPromise;
return dbQueryResult;
};
经过更多测试,我发现第一个 API 调用有效,但之后的任何调用 return 都无效...
编辑:
this._dbModel 是一些 mongoose 模式。例如,
const dbSchema= new Schema({
name: String,
});
const dbModel = mongoose.model('DbSchema', dbSchema);
尝试按如下方式替换您的 dbQueryPromise:
const dbQueryPromise = this._dbModel.findById(_id, modelView).lean().exec();
除非您传递 callBack function
或使用 exec()
,否则不会执行 Mongoose 查询
对于遇到类似问题的其他人,以下是我的解决方法:
我变了
const dbQueryResult = await dbQueryPromise;
至
const dbQueryResult = await dbQueryPromise.then((doc) => {
return doc;
});
我有一些异步代码可以调用 mongo 数据库和 inserts/fetches 项。当我在本地开发时,下面的代码工作正常。但是,当我将 mongoose 实例连接到 MongoDb Atlas 时,出现了问题。特别是,除非我 console.log 承诺,否则我的代码似乎无法正常工作,这对我来说毫无意义。例如,使用 console.log 语句,我的所有测试都按预期通过了。没有它,35 次测试失败...这是因为我期望 return 的承诺为空,而它应该 return 来自数据库的一些 JSON 对象。我的代码没有正确阻塞吗?
感觉就像我在和薛定谔的猫打交道...任何帮助将不胜感激。提前致谢。
下面是一个 promise/function 调用示例。然后我将它传递给 _executeQuery。我已经等待相关功能,所以我不认为这是因为我在某处遗漏了等待这个词。
async _inSomeAsyncFunction = () => {
const dbQueryPromise = this._dbModel.findById(_id, modelView).lean();
await this._executeQuery({ dbQueryPromise, isAccessPermitted: true })
}
_executeQuery 基本上是在用户有权限的情况下得到 promise 的结果。
private _executeQuery = async (props: {
isAccessPermitted: boolean;
dbQueryPromise: Promise<any>;
}): Promise<any> => {
const { isAccessPermitted, dbQueryPromise } = props;
if (!isAccessPermitted) {
throw new Error('Access denied.');
}
console.log(dbQueryPromise, 'promise'); // without this line, dbQueryResult would be null...
const dbQueryResult = await dbQueryPromise;
return dbQueryResult;
};
经过更多测试,我发现第一个 API 调用有效,但之后的任何调用 return 都无效...
编辑:
this._dbModel 是一些 mongoose 模式。例如,
const dbSchema= new Schema({
name: String,
});
const dbModel = mongoose.model('DbSchema', dbSchema);
尝试按如下方式替换您的 dbQueryPromise:
const dbQueryPromise = this._dbModel.findById(_id, modelView).lean().exec();
除非您传递 callBack function
或使用 exec()
对于遇到类似问题的其他人,以下是我的解决方法:
我变了
const dbQueryResult = await dbQueryPromise;
至
const dbQueryResult = await dbQueryPromise.then((doc) => {
return doc;
});