Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript角度解析查询同步(按顺序)_Javascript_Angularjs_Parse Platform_Promise - Fatal编程技术网

Javascript角度解析查询同步(按顺序)

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

我正在尝试使用javascript中的Parse按顺序同步执行两个查询:

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 此处的打印错误;}