Javascript角度解析查询同步(按顺序)
我正在尝试使用javascript中的Parse按顺序同步执行两个查询:Javascript角度解析查询同步(按顺序),javascript,angularjs,parse-platform,promise,Javascript,Angularjs,Parse Platform,Promise,我正在尝试使用javascript中的Parse按顺序同步执行两个查询: var innerQuery = new Parse.Query(Attendees); innerQuery.equalTo("user_id",$localStorage.username); innerQuery.equalTo("status","confirmed") innerQuery.equalTo("code_verified",false) var innerQuery
var innerQuery = new Parse.Query(Attendees);
innerQuery.equalTo("user_id",$localStorage.username);
innerQuery.equalTo("status","confirmed")
innerQuery.equalTo("code_verified",false)
var innerQuerytrue = new Parse.Query(Attendees);
innerQuerytrue.equalTo("user_id",$localStorage.username);
innerQuerytrue.equalTo("status","confirmed")
innerQuerytrue.equalTo("code_verified",true)
innerQuery.find({})
innerQuerytrue.find({})
var eventDetails = []
var queryfalse = new Parse.Query(Events)
queryfalse.matchesKeyInQuery("id_event","event_id",innerQuery);
var querytrue = new Parse.Query(Events)
querytrue.matchesKeyInQuery("id_event","event_id",innerQuerytrue);
queryfalse.find().then(function(results){
for (var i in results) {
var object = results[i];
var eventId = object.get("id_event");
var eventname = object.get("event_name");
var datestart = object.get("date_start");
var location = object.get("location");
var eventimagefile = object.get("event_image");
var eventimageurl = eventimagefile.url();
eventDetails.push({'name':eventname,'eventId':eventId, 'location':location, 'datestart':datestart, 'eventphoto':eventimageurl,'verified':false})
}
}).then(function(){
querytrue.find().then(function(results1){
for (var i in results1) {
var object = results1[i];
var eventId = object.get("id_event");
var eventname = object.get("event_name");
var datestart = object.get("date_start");
var location = object.get("location");
var eventimagefile = object.get("event_image");
var eventimageurl = eventimagefile.url();
eventDetails.push({'name':eventname,'eventId':eventId, 'location':location, 'datestart':datestart, 'eventphoto':eventimageurl,'verified':true})
}
})
}).then(function(){
$scope.events = eventDetails;
})
第二个查询queryfalse并不总是执行。我正在使用承诺,但不确定是否正确使用它们。您必须将角度结果移动到第二个承诺
var innerQuery = new Parse.Query(Attendees);
innerQuery.equalTo("user_id",$localStorage.username);
innerQuery.equalTo("status","confirmed")
innerQuery.equalTo("code_verified",false)
var innerQuerytrue = new Parse.Query(Attendees);
innerQuerytrue.equalTo("user_id",$localStorage.username);
innerQuerytrue.equalTo("status","confirmed")
innerQuerytrue.equalTo("code_verified",true)
innerQuery.find({})
innerQuerytrue.find({})
var eventDetails = []
var queryfalse = new Parse.Query(Events)
queryfalse.matchesKeyInQuery("id_event","event_id",innerQuery);
var querytrue = new Parse.Query(Events)
querytrue.matchesKeyInQuery("id_event","event_id",innerQuerytrue);
queryfalse.find().then(function(results){
for (var i in results) {
var object = results[i];
var eventId = object.get("id_event");
var eventname = object.get("event_name");
var datestart = object.get("date_start");
var location = object.get("location");
var eventimagefile = object.get("event_image");
var eventimageurl = eventimagefile.url();
eventDetails.push({'name':eventname,'eventId':eventId, 'location':location, 'datestart':datestart, 'eventphoto':eventimageurl,'verified':false})
}
}).then(function(){
querytrue.find().then(function(results1){
for (var i in results1) {
var object = results1[i];
var eventId = object.get("id_event");
var eventname = object.get("event_name");
var datestart = object.get("date_start");
var location = object.get("location");
var eventimagefile = object.get("event_image");
var eventimageurl = eventimagefile.url();
eventDetails.push({'name':eventname,'eventId':eventId, 'location':location, 'datestart':datestart, 'eventphoto':eventimageurl,'verified':true})
}
}).then(function(){
$scope.events = eventDetails;
});
})
你必须把角度结果移到第二个承诺
var innerQuery = new Parse.Query(Attendees);
innerQuery.equalTo("user_id",$localStorage.username);
innerQuery.equalTo("status","confirmed")
innerQuery.equalTo("code_verified",false)
var innerQuerytrue = new Parse.Query(Attendees);
innerQuerytrue.equalTo("user_id",$localStorage.username);
innerQuerytrue.equalTo("status","confirmed")
innerQuerytrue.equalTo("code_verified",true)
innerQuery.find({})
innerQuerytrue.find({})
var eventDetails = []
var queryfalse = new Parse.Query(Events)
queryfalse.matchesKeyInQuery("id_event","event_id",innerQuery);
var querytrue = new Parse.Query(Events)
querytrue.matchesKeyInQuery("id_event","event_id",innerQuerytrue);
queryfalse.find().then(function(results){
for (var i in results) {
var object = results[i];
var eventId = object.get("id_event");
var eventname = object.get("event_name");
var datestart = object.get("date_start");
var location = object.get("location");
var eventimagefile = object.get("event_image");
var eventimageurl = eventimagefile.url();
eventDetails.push({'name':eventname,'eventId':eventId, 'location':location, 'datestart':datestart, 'eventphoto':eventimageurl,'verified':false})
}
}).then(function(){
querytrue.find().then(function(results1){
for (var i in results1) {
var object = results1[i];
var eventId = object.get("id_event");
var eventname = object.get("event_name");
var datestart = object.get("date_start");
var location = object.get("location");
var eventimagefile = object.get("event_image");
var eventimageurl = eventimagefile.url();
eventDetails.push({'name':eventname,'eventId':eventId, 'location':location, 'datestart':datestart, 'eventphoto':eventimageurl,'verified':true})
}
}).then(function(){
$scope.events = eventDetails;
});
})
只需添加return,即可传递querytrue.find.then返回的承诺,然后向下传递,这样在承诺得到解决之前,下一个then将不会执行。这还可以使您的代码更平坦,以避免深陷其中的承诺
queryfalse.find().then(function(results){
// code clipped for brevity
}).then(function(){
return querytrue.find().then(function(results1){
// code clipped for brevity
});
}).then(function(){
$scope.events = eventDetails;
});
下面是一个正在工作的plunker,它演示了这一点:只需添加return,即可传递querytrue.find.then返回的承诺,然后沿着该链向下移动,这样,在承诺得到解决之前,下一个将不会执行。这还可以使您的代码更平坦,以避免深陷其中的承诺
queryfalse.find().then(function(results){
// code clipped for brevity
}).then(function(){
return querytrue.find().then(function(results1){
// code clipped for brevity
});
}).then(function(){
$scope.events = eventDetails;
});
下面是一个正在工作的plunker,它演示了这一点:querytrue.find->返回一个承诺,该承诺最终返回您感兴趣的结果列表 。然后在一个承诺后设置一些操作,并立即返回另一个承诺。您还可以传递成功处理程序和错误处理程序函数 所以,当你说
var p = querytrue.find().then(onSuccess, onError)
p是一个承诺,它将成为成功或失败函数的返回值,无论哪个函数运行。你可以通过添加另一个来约束另一个承诺。然后
此链接承诺获取第一个承诺的返回值
如果第一个promise success函数运行,第二个chained success函数也将运行,与error函数类似
如果您的成功处理程序创建了另一个承诺,如您的问题,您可以从成功处理程序返回该承诺,并且任何后续链接的承诺都将等待该承诺。有点像在链中添加链接
var p = query1.find();
p.then( function(){
... // runs after query1.find()
var q = query2.find().then(...);
return q;
})
.then( function() {
... // runs after query1.find() and query2.find()
});
querytrue.find->返回一个承诺,该承诺最终将返回您感兴趣的结果列表 。然后在一个承诺后设置一些操作,并立即返回另一个承诺。您还可以传递成功处理程序和错误处理程序函数 所以,当你说
var p = querytrue.find().then(onSuccess, onError)
p是一个承诺,它将成为成功或失败函数的返回值,无论哪个函数运行。你可以通过添加另一个来约束另一个承诺。然后
此链接承诺获取第一个承诺的返回值
如果第一个promise success函数运行,第二个chained success函数也将运行,与error函数类似
如果您的成功处理程序创建了另一个承诺,如您的问题,您可以从成功处理程序返回该承诺,并且任何后续链接的承诺都将等待该承诺。有点像在链中添加链接
var p = query1.find();
p.then( function(){
... // runs after query1.find()
var q = query2.find().then(...);
return q;
})
.then( function() {
... // runs after query1.find() and query2.find()
});
他也可以在querytrue.find前面加上return。然后把最后一个留在原来的地方?我忘了这是否是有效语法。实际上我不是100%确定。@ai20,因为$scope.events是在queryfalse调用之后设置的,querytrue不会更新它。所以连续的承诺不应该按顺序执行吗?我不明白为什么最后一个承诺是在第二个承诺完成之前执行的。@ai20,最后一个承诺从未被给予承诺,所以它会立即执行。查看我的答案,了解如何使用您的代码结构实现最后的承诺。他是否可以在querytrue.find前面添加return。然后把最后一个留在原来的地方?我忘了这是否是有效语法。实际上我不是100%确定。@ai20,因为$scope.events是在queryfalse调用之后设置的,querytrue不会更新它。所以连续的承诺不应该按顺序执行吗?我不明白为什么最后一个承诺是在第二个承诺完成之前执行的。@ai20,最后一个承诺从未被给予承诺,所以它会立即执行。请参阅我的答案,了解如何使用您的代码结构实现最后的承诺。您也可以使用“.finally”这只接受一个函数,该函数无论承诺成功与否都将运行,这可能是您根据您的推理得出的结果“如果第一个承诺成功函数运行,第二个链接成功函数也将运行”。。我不明白为什么我的代码错了。在querytrue.find之后,应该执行一个带有queryfalse.find的承诺,然后执行另一个承诺来分配结果。它不是按顺序发生的。为什么?请尝试向“then”语句添加失败处理程序。非常简单:…然后函数{…},函数{print Error here;}您也可以使用“.最后”这只需要一个函数,无论承诺成功或失败都将运行,这可能是您根据您的推理得出的结果“如果第一个承诺成功函数运行,第二个链接成功函数也将运行”。。我不明白为什么我的代码错了。在querytrue.find之后,应该执行一个带有queryfalse.find的承诺,然后执行另一个承诺来分配结果。它不是按顺序发生的。为什么?请尝试向“then”语句添加失败处理程序。非常简单:…然后函数{…},函数{p 此处的打印错误;}