Javascript угловой анализ запросов синхронно (по порядку)

javascript angularjs parse-platform promise

46 просмотра

3 ответа

56 Репутация автора

Я пытаюсь использовать Parse в JavaScript, чтобы сделать два запроса синхронно в последовательности:

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, не всегда выполняется. Я использую обещания и не уверен, что это правильный способ их использования.

Автор: ai20 Источник Размещён: 18.07.2016 10:14

Ответы (3)


1 плюс

67870 Репутация автора

Решение

Вы должны переместить угловой результат ко 2-му обещанию.

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;
        });
    })
Автор: OneOfOne Размещён: 18.07.2016 10:18

3 плюса

13898 Репутация автора

Просто добавьте, 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;
    });

Вот рабочий планер, который демонстрирует это: https://plnkr.co/edit/SwPIC1K6yEhEgpIlxoEo?p=preview

Автор: adam0101 Размещён: 18.07.2016 10:40

0 плюса

951 Репутация автора

querytrue.find () -> возвращает обещание, и это обещание в конечном итоге возвращает список результатов, которые вас интересуют.

.then () устанавливает некоторые действия после обещания и немедленно возвращает другое обещание. Вы также можете передать обработчик успеха и функцию обработки ошибок

так что, когда вы говорите

var p = querytrue.find().then(onSuccess, onError) 

p - это обещание, которое станет возвращаемым значением функции успеха или неудачи, в зависимости от того, что выполняется. Вы можете связать другое обещание, добавив другое .then ()

Это связанное обещание получает значение возврата первого обещания.

Если первая функция успеха обещания была запущена, вторая цепочка успеха также будет запущена, также как и с функциями ошибок.

Если ваш обработчик успеха создает другое обещание (например, ваш вопрос), вы можете вернуть это обещание от обработчика успеха, и любые последующие обещания будут ожидать этого обещания. Вроде как добавить ссылку в цепочку.

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()
});
Автор: ryansstack Размещён: 18.07.2016 10:49
Вопросы из категории :
32x32