MongoDB查询中的顺序查询有时工作不正常
我正在按顺序执行2个更新查询。我正在使用生成器函数和yield来处理javascript的异步行为MongoDB查询中的顺序查询有时工作不正常,mongodb,mongodb-query,Mongodb,Mongodb Query,我正在按顺序执行2个更新查询。我正在使用生成器函数和yield来处理javascript的异步行为 var result = yield db.tasks.update({ "_id": task._id, "taskLog":{$elemMatch:{"currentApproverRole": vcurrentApproverRole, "currentApprover":
var result = yield db.tasks.update({
"_id": task._id,
"taskLog":{$elemMatch:{"currentApproverRole": vcurrentApproverRole,
"currentApprover": new RegExp(employeeCode, 'i')}}
}, {
$set: {
"taskPendingAt": vnextApproverEmpCode,
"status": vactionTaken,
"lastUpdated": vactionTakenTime,
"lastUpdatedBy": employeeCode,
"shortPin":shortPin,
"workFlowDetails":task.workFlowDetails,
"taskLog.$.reason": reason,
"taskLog.$.actionTakenBy": employeeCode,
"taskLog.$.actionTakenByName": loggedInUser.firstName+" "+loggedInUser.lastName,
"taskLog.$.actionTaken": vactionTaken,
"taskLog.$.actionTakenTime": vactionTakenTime
}
});
var vstatus = vactionTaken;
// Below is the query that is not working properly sometimes
yield db.groupPicnic.update({"gppTaskId": task.workFlowDetails.gppTaskId, "probableParticipantList.employeeCode": task.createdBy},
{
$set: {
'probableParticipantList.$.applicationStatus': vactionTaken
}
})
第二次更新操作有时不执行(10次中有9次有效)。我似乎不知道如何处理这个问题?ES6生成器应该提供一种编写迭代器的简单方法 迭代器只是一个值序列——就像一个数组,但它是动态使用的,并且是惰性生成的 目前,您的代码执行以下操作:
let imAnUnresolvedPromise = co().next();
// exiting app, promise might not resolve in time
通过前进,而不是等待承诺(假设你的应用程序关闭),你不能保证它会及时执行,因此为什么你会体验到不稳定的行为
你所要改变的就是等待承诺的解决
let resolveThis = await co().next();
编辑:
如果没有async
/await
语法,则必须使用嵌套回调来保证正确的顺序,如下所示:
co().next().then((promiseResolved) => {
co().next().then((promiseTwoResolved) => {
console.log("I'm done")
})
});
ES6生成器应该提供一种编写迭代器的简单方法 迭代器只是一个值序列——就像一个数组,但它是动态使用的,并且是惰性生成的 目前,您的代码执行以下操作:
let imAnUnresolvedPromise = co().next();
// exiting app, promise might not resolve in time
通过前进,而不是等待承诺(假设你的应用程序关闭),你不能保证它会及时执行,因此为什么你会体验到不稳定的行为
你所要改变的就是等待承诺的解决
let resolveThis = await co().next();
编辑:
如果没有async
/await
语法,则必须使用嵌套回调来保证正确的顺序,如下所示:
co().next().then((promiseResolved) => {
co().next().then((promiseTwoResolved) => {
console.log("I'm done")
})
});
你在承诺,你在等待它的解决吗?您可以发布生成器调用吗?我认为yield本身应该保持执行直到查询执行完成并返回promise。不管怎样,我使用它就像是
co(function*(){querys…})
你在承诺,你在等待它的解决吗?您可以发布生成器调用吗?我认为yield本身应该保持执行直到查询执行完成并返回promise。无论如何,我使用它就像co(function*(){querys…})
不确定如何在生成器函数中使用waitwait
不在生成器中,而是基于它产生的承诺。您也可以在生成器中wait
,但这不会提供您想要的行为。我尝试在更新查询中使用回调,但甚至没有执行更新操作。我的环境依赖性导致我无法使用所有ES6功能,如async&Wait。我在我的帖子中添加了回调语法。不确定如何在生成器函数中使用waitwait
不是在生成器中,而是在它产生的承诺上。您也可以在生成器中wait
,但这不会提供您想要的行为。我尝试在更新查询中使用回调,但甚至没有执行更新操作。我的环境依赖性导致我无法使用所有ES6功能,如async&Wait。有没有一种方法可以通过使用yield only来实现这一点我在我的帖子中添加了回调语法。