2016-07-29 10 views
-1

ich eine Kette von Versprechungen in Winkeln mit und ich würde am Ende der Kette, die wie ein Wert zurückgegeben werden soll:Javascript Angular resolve Kette von Versprechen vor einem Ergebniswert der Rückkehr

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 
} 

die Kette 'promise' wird nicht aufgelöst, bevor die Rückgabe übergeben wird: count_pres wird zurückgegeben, bevor $ q.all (promise) fertig ist. Irgendeine Idee?

+0

Statt '$ q.all (Versprechen) return count_pres' verwenden' return $ q.all (Versprechen) ' – varit05

+0

es nicht funktioniert: Die gesamte Versprechen Kette in diesem Fall wird statt nur die zurückgegeben werden Wert count_pres – ai20

+1

gibt die kombinierten Versprechen zurück, anstatt count_pres zurückzugeben, genau wie @ varit05 sagte, und behandelt die Zuweisung von Werten außerhalb dieser Funktion. Versprechen sind asynchron – doge1ord

Antwort

1

Ich kann mir nicht vorstellen, dass das jemals funktionieren wird? So verketten Sie Versprechen und schreiben asynchrone Versprechen.

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 Ich sehe, du brauchst noch ein Versprechen, um eine Ausgabe des Versprechens zu erhalten. Danke – ai20

+0

Gern geschehen. Wenn Sie Versprechungen verketten möchten, können Sie einfach ein anderes Versprechen in der 'then'-Funktion zurückgeben. Aber Sie sollten es nur verwenden, wenn Sie Daten benötigen, um den Fluss fortzusetzen. Wenn einfach alle Daten benötigt werden, sollten Sie '$ q.all' verwenden. – Pjetr