gpt4 book ai didi

javascript - 主 promise 链不等待 Parse.Query

转载 作者:行者123 更新时间:2023-11-30 17:21:20 25 4
gpt4 key购买 nike

我正在尝试在我的 matchCenterComparison 函数中运行 Parse.Query,它是下面主要 promise 链的一部分。

当我运行这段代码时,它会注销 ('setup query criteria, about to run it');('MatchCenterComparison Succeeded bro!'),但是不是 userCategoryThingQuery.find().then 中的 console.log

我已经在线研究了这个,并查看了 Parse.Query Documentation ,我的结论是主 promise 链不会等待 userCategoryThingQuery 完成,因为它是异步的。这是导致问题的原因吗?如果是这样,我该如何解决?

主 promise 链:

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);
});
});

ma​​tchCenterComparison 函数:

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;

}

最佳答案

你的问题在这里:

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);
});
})

这里有一个问题 - 这个函数返回什么?

答案 - 它返回未定义。它不返回 promise ,因此链无需等待。

您需要做的是从 usersQuery 循环中获取所有 promise ,并返回一个 promise ,直到它们全部完成才完成。尝试像这样重写:

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 的文档,重要的部分是:

If the callback returns a promise, the iteration will not continue until that promise has been fulfilled.

Returns: {Parse.Promise} A promise that will be fulfilled once the iteration has completed.

所以这应该可以满足您的需求 - usersQuery.each 调用将返回一个在迭代结束时完成的 promise ,并且从回调内部返回 promise 将意味着直到所有项目都完成后迭代才会完成已处理。

关于javascript - 主 promise 链不等待 Parse.Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25085314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com