2016-07-29 5 views
-1

Я использую цепочку обещаний в угловом и я хотел бы, чтобы в конце цепочки значение должно быть возвращено:Javascript Угловую решительность цепи обещаний перед возвращением значения результата

this.calculateeventsattended = function(username) { 
    var Attendees = Parse.Object.extend("Attendees"); 
    var User = Parse.Object.extend("User"); 
    var count_pres = 0 
    query1 = new Parse.Query(Attendees); 
    query1.equalTo("user_id",username); 
    query1.equalTo("presence",true)   

    var promise = query1.count(function(count){ 
     count_pres = count 
    }).then(function(){ 
     query2 = new Parse.Query(User); 
     query2.equalTo("username",username); 
     query2.first().then(function(object){ 
      alert("parse" + count_pres) 
      object.set("events_attended",count_pres) 
      object.save() 
     }) 
    }) 
$q.all(promise) 
return count_pres 
} 

по цепочке «обещание» не разрешается до того, как будет возвращено возвращение: count_pres возвращается до завершения $ q.all (обещание). Есть идеи?

+0

вместо '$ q.all (обещание) возвращение count_pres' использовать' возврат $ q.all (обещание) ' – varit05

+0

он не работает: в этом случае вся цепочка обещание будет возвращен вместо только value count_pres – ai20

+1

возвращает объединенные обещания вместо возврата count_pres так же, как и @ varit05, и обрабатывает присвоение значений вне этой функции. Обещания асинхронны – doge1ord

ответ

1

Я не могу себе представить, что это когда-нибудь будет работать? Вот как вы связываете обещания и как писать асинхронные обещания.

function chainedPromises() { 
    return $q(function(resolve) { 
     query 
      .firstPromise() 
      .then(function(firstResult) { 
       return query.secondPromise(firstResult.something); 
      }) 
      .then(function(secondResult) { 
       return query.thirdPromise(secondResult.something); 
      }) 
      .then(function(thirdResult) { 
       return query.fourthPromise(thirdResult.something); 
      }) 
      .then(function(fourthResult) { 
       resolve(fourthResult); 
      }); 
    }); 
} 

function asyncPromises() { 
    var promises = []; 

    promises.push(query.firstPromise()); 
    promises.push(query.secondPromise()); 
    promises.push(query.thirdPromise()); 
    promises.push(query.fourthPromise()); 

    return $q.all(promises); 
} 

chainedPromises() 
    .then(function(fourthResult) { 
     doSomethingWith(fourthResult); 
    }); 

asyncPromises() 
    .then(function(results) { 
     doSomethingWith(results); 
    }); 
+0

ok Я вижу, вам все еще нужно обещание получить результат обещания. Спасибо – ai20

+0

Добро пожаловать. Когда вы хотите связать обещания, вы можете просто вернуть другое обещание в функцию 'then'. Но вы должны использовать его только тогда, когда вам нужны данные для продолжения потока. Если требуется просто все данные, вы должны использовать '$ q.all'. – Pjetr

Смежные вопросы