解析:Query.find 在循环内找不到数据(即使在使用承诺之后)
Parse: Query.find does not find data inside loop (even after using promises)
我实际上传递了两个列表(existingLeaderboard 和 newResultSetObj),我正在根据某种逻辑比较和查询它们。最后我想根据逻辑向每个用户发送通知。但不知何故,我的代码不等待查找查询(控制台日志永远不会出现在日志中)。这是代码 -
function compareAndSendNotification(existingLeaderboard, newResultSetObj) {
var _ = require('underscore');
var leadboardarray=[];
console.log("New leaderboard" + newResultSetObj);
console.log("Existing leaderboard" + existingLeaderboard);
leadboardarray = existingLeaderboard;
if (typeof existingLeaderboard == "undefined" || typeof newResultSetObj == "undefined"
|| existingLeaderboard.length == 0 || newResultSetObj.length == 0) {
console.log("existingLeaderboard or newResultSetObj is null");
return true;
}
var getUserFromLookPromise = Parse.Promise.as();
var fromUser = "";
//Event out looks
_.each(existingLeaderboard, function(test) {
if (contains(newResultSetObj, test)) {
console.log("Look id still in top 3 i =" + test);
// get user from look
var lookId = test;
console.log('get look id called ' + lookId);
var look = Parse.Object.extend("Look");
var lookQuery = new Parse.Query(look);
lookQuery.equalTo("objectId", lookId);
console.log("before find query");
//getUserFromLookPromise=getUserFromLookPromise.then(function(){
// return lookQuery.find();
lookQuery.find().then(function(){
// following console log never prints
console.log("inside find query");
var lookqueryPromise = Parse.Promise.as();
lookqueryPromise = lookqueryPromise.then(function() {
return lookQuery.find();
});
//while(lookqueryPromise.find().length==0){
// lookqueryPromise.resolve(lookQuery.find());
//}
return lookqueryPromise;
}).then(function (notificationUser) {
console.log("inside resolve user");
if ( typeof notificationUser == "undefined" || notificationUser.length == 0 ) {
getUserFromLookPromise.resolve(notificationUser);
}
fromUser = notificationUser[0].get['fromUser'];
return fromUser;
}).then(function (user) {
console.log("sending notification to user " + user);
sendNotification(user, "hello");
});
}
});
return getUserFromLookPromise;
}
我是解析新手。请让我知道我做错了什么。
让我们从一个较小的问题开始:获取一个 "Look" 对象给定它的 id:
function lookWithId(objectId) {
var query = new Parse.Query("Look");
query.include("fromUser"); // presumes "fromUser" is a pointer to Parse.User
return query.get(objectId);
}
现在,让我们使用该函数来解决一个更大的问题:在给定 id 数组的情况下获取 "Look" 个对象的数组:
var _ = require('underscore');
function looksWithIds(objectIds) {
var promises = _.map(objectIds, function(objectId) {
return lookWithId(objectId);
});
return Parse.Promise.when(promises);
}
现在更难了。给定一组用户,向每个用户发送一条消息。仅当您的应用通过在每个安装上设置 "user" 指针将安装与用户相关联时,才能完成此操作。
function sendMessageToUser(user) {
var query = new Parse.Query(Parse.Installation);
query.equalTo('user', user);
return Parse.Push.send(where: query, data: { alert: "Hello" });
}
然后像我们之前那样将那个复数化...
function sendMessagesToUsers(users) {
var promises = _.map(users, function(user) {
return sendMessageToUser(user);
});
return Parse.Promise.when(promises);
}
您编写的另一个函数:给定两个排行榜,return 满足某些应用程序条件的 "Look" 个对象 ID 数组...
function lookIdsFromLeaderBoards(leaderBoardA, leaderBoardB) {
// written by @user2922400, based on the app
// no promises needed here, just answer an array of Look object ids
}
现在,您尝试的功能非常简单:
function sendMessagesToLeader(leaderBoardA, leaderBoardB) {
var lookIds = lookIdsFromLeaderBoards(leaderBoardA, leaderBoardB);
return looksWithIds(lookIds).then(function(lookObjects) {
var users = _.map(lookObjects, function(lookObject) {
return lookObject.get("fromUser");
});
return sendMessagesToUsers(users);
})
}
我实际上传递了两个列表(existingLeaderboard 和 newResultSetObj),我正在根据某种逻辑比较和查询它们。最后我想根据逻辑向每个用户发送通知。但不知何故,我的代码不等待查找查询(控制台日志永远不会出现在日志中)。这是代码 -
function compareAndSendNotification(existingLeaderboard, newResultSetObj) {
var _ = require('underscore');
var leadboardarray=[];
console.log("New leaderboard" + newResultSetObj);
console.log("Existing leaderboard" + existingLeaderboard);
leadboardarray = existingLeaderboard;
if (typeof existingLeaderboard == "undefined" || typeof newResultSetObj == "undefined"
|| existingLeaderboard.length == 0 || newResultSetObj.length == 0) {
console.log("existingLeaderboard or newResultSetObj is null");
return true;
}
var getUserFromLookPromise = Parse.Promise.as();
var fromUser = "";
//Event out looks
_.each(existingLeaderboard, function(test) {
if (contains(newResultSetObj, test)) {
console.log("Look id still in top 3 i =" + test);
// get user from look
var lookId = test;
console.log('get look id called ' + lookId);
var look = Parse.Object.extend("Look");
var lookQuery = new Parse.Query(look);
lookQuery.equalTo("objectId", lookId);
console.log("before find query");
//getUserFromLookPromise=getUserFromLookPromise.then(function(){
// return lookQuery.find();
lookQuery.find().then(function(){
// following console log never prints
console.log("inside find query");
var lookqueryPromise = Parse.Promise.as();
lookqueryPromise = lookqueryPromise.then(function() {
return lookQuery.find();
});
//while(lookqueryPromise.find().length==0){
// lookqueryPromise.resolve(lookQuery.find());
//}
return lookqueryPromise;
}).then(function (notificationUser) {
console.log("inside resolve user");
if ( typeof notificationUser == "undefined" || notificationUser.length == 0 ) {
getUserFromLookPromise.resolve(notificationUser);
}
fromUser = notificationUser[0].get['fromUser'];
return fromUser;
}).then(function (user) {
console.log("sending notification to user " + user);
sendNotification(user, "hello");
});
}
});
return getUserFromLookPromise;
}
我是解析新手。请让我知道我做错了什么。
让我们从一个较小的问题开始:获取一个 "Look" 对象给定它的 id:
function lookWithId(objectId) {
var query = new Parse.Query("Look");
query.include("fromUser"); // presumes "fromUser" is a pointer to Parse.User
return query.get(objectId);
}
现在,让我们使用该函数来解决一个更大的问题:在给定 id 数组的情况下获取 "Look" 个对象的数组:
var _ = require('underscore');
function looksWithIds(objectIds) {
var promises = _.map(objectIds, function(objectId) {
return lookWithId(objectId);
});
return Parse.Promise.when(promises);
}
现在更难了。给定一组用户,向每个用户发送一条消息。仅当您的应用通过在每个安装上设置 "user" 指针将安装与用户相关联时,才能完成此操作。
function sendMessageToUser(user) {
var query = new Parse.Query(Parse.Installation);
query.equalTo('user', user);
return Parse.Push.send(where: query, data: { alert: "Hello" });
}
然后像我们之前那样将那个复数化...
function sendMessagesToUsers(users) {
var promises = _.map(users, function(user) {
return sendMessageToUser(user);
});
return Parse.Promise.when(promises);
}
您编写的另一个函数:给定两个排行榜,return 满足某些应用程序条件的 "Look" 个对象 ID 数组...
function lookIdsFromLeaderBoards(leaderBoardA, leaderBoardB) {
// written by @user2922400, based on the app
// no promises needed here, just answer an array of Look object ids
}
现在,您尝试的功能非常简单:
function sendMessagesToLeader(leaderBoardA, leaderBoardB) {
var lookIds = lookIdsFromLeaderBoards(leaderBoardA, leaderBoardB);
return looksWithIds(lookIds).then(function(lookObjects) {
var users = _.map(lookObjects, function(lookObject) {
return lookObject.get("fromUser");
});
return sendMessagesToUsers(users);
})
}