我正在尝试在我的matchCenterComparison
函数中运行Parse.Query,它是下面主要承诺链的一部分。
当我运行此代码时,它会在('setup query criteria, about to run it');
内注销('MatchCenterComparison Succeeded bro!')
和console.log
,但不会注销userCategoryThingQuery.find().then
。
我在网上研究了这个,并浏览了Parse.Query Documentation,我的结论是主要的承诺链不等待userCategoryThingQuery
完成,因为它是异步的。这是导致问题的原因吗?如果是这样,我该如何解决这个问题呢?
主要承诺链:
Parse.Cloud.job("MatchCenterBackground", function(request, status) {
// ... other code to setup usersQuery ...
var usersQuery = new Parse.Query(Parse.User);
usersQuery.each(function (user) {
return processUser(user).then(function(eBayResults){
return matchCenterComparison(eBayResults);
});
}).then(function() {
status.success("background job worked brah!");
}, function(error) {
status.error(error);
});
});
matchCenterComparison功能:
function matchCenterComparison(eBayResults) {
console.log('eBayResults are the following:' + eBayResults);
var matchCenterComparisonPromise = new Parse.Promise();
if (eBayResults.length > 0) {
// do some work, possibly async
console.log('yes the ebay results be longer than 0');
var userCategoryThing = Parse.Object.extend("userCategory");
var userCategoryThingQuery = new Parse.Query(userCategoryThing);
userCategoryThingQuery.contains('categoryId', '9355');
console.log('setup query criteria, about to run it');
userCategoryThingQuery.find().then(function(results) {
console.log('lets see what we got here:' + results);
});
matchCenterComparisonPromise.resolve(console.log('MatchCenterComparison Succeeded bro!'));
} else {
matchCenterComparisonPromise.reject({ message: 'No work done, expression failed' });
}
return matchCenterComparisonPromise;
}
答案 0 :(得分:2)
你的问题在这里:
function(request, status) {
// ... other code to setup usersQuery ...
var usersQuery = new Parse.Query(Parse.User);
usersQuery.each(function (user) {
return processUser(user).then(function(eBayResults){
return matchCenterComparison(eBayResults);
});
})
这是一个问题 - 这个函数会返回什么?
答案 - 它返回undefined。它不会返回承诺,因此链条无需等待。
你需要做的是将你的循环中的所有承诺都带到usersQuery,并返回一个未完成的承诺,直到他们都这样做。尝试重写如下:
function(request, status) {
// ... other code to setup usersQuery ...
var usersQuery = new Parse.Query(Parse.User);
return usersQuery.each(function (user) {
return processUser(user).then(function(eBayResults){
return matchCenterComparison(eBayResults);
});
}))
查看Parse.Query的文档,重要的是这个:
如果回调返回一个promise,迭代将不会继续 直到履行承诺。
和
返回:{Parse.Promise}一旦完成将履行的承诺 迭代已经完成。
所以这应该得到你想要的东西 - usersQuery.each调用将返回一个在迭代结束时完成的promise,并且从回调内部返回promise将意味着迭代在完成所有项目之后才会完成已经处理完毕。