2017-05-29 4 views
0

Wie kann ich die folgende Funktion, um eine Zusage zurückzugeben, damit ich es richtig in der Seite, die diese Funktion aufruft, umgehen kann?Rückgabe der Ergebnisse als Versprechen in Typescript

getUploads() { 
    const rootDef = this.db.database.ref(); 
    const uploadsRef = rootDef.child('userUploads').orderByChild('time'); 
    const userRef = rootDef.child("userProfile"); 
    var uploads = []; 

    uploadsRef.once("value").then((uploadSnaps) => { 

     uploadSnaps.forEach((uploadSnap) => { 

     var upload = uploadSnap.val(); 

     userRef.child(uploadSnap.val().user).once("value").then((userSnap) => { 
      upload.displayName = userSnap.val().displayName; 
      upload.avatar = userSnap.val().avatar; 
      uploads.push(upload); 
     }); 

     }); 

    }); 

    return uploads; 
} 

Ich versuchte das unten, aber es zeigt Fehler. Wie soll ich ändern?

return new Promise((resolve, reject) => { 
    resolve(uploads); 
}); 

Ich werde diese Methode aufrufen, wie unten gezeigt.

this.db.getUploads().then((uploads) => { 
    this.allUploads = uploads; 
    console.log(this.allUploads); 
}); 

Antwort

2

Ich glaube, man kann den Inhalt Ihre Methode mit

getUploads() { 
    return new Promise((resolve, reject) => { 
     // content of method 
     resolve(uploads); // instead of "return uploads" 
    }); 
} 
+0

Diese auf ein leeres Array lösen würde. Die Lösung muss irgendwo in den Callbacks platziert werden. –

+0

Editierte Antwort funktioniert für mein Versprechen – user3050534

+0

Es funktioniert auch für mich. Wie unterscheidet es sich von meiner Art, Versprechen zu geben? – Purus

1

umgeben Sie Promise.resolve verwenden können:

Die Promise.resolve (Wert) Methode gibt ein Versprechen Objekt das ist aufgelöst mit dem gegebenen Wert. Wenn der Wert ein anschließbares ist (d. H. Hat eine "dann" -Methode), wird die zurückgegebene Zusage "diesem" dann folgen, seinen letzten Zustand übernehmen; Andernfalls wird das zurückgegebene Versprechen mit dem Wert erfüllt.

So einfach:

return Promise.resolve(uploads); 

Aber das Problem mit Ihrem Code ist, dass Sie den Wert zurück, bevor die uploadsRef.once("value").then(...) aufgerufen wurde.
Sie sollten einfach das Ergebnis von then zurück:

return uploadsRef.once("value").then((uploadSnaps) => { 
    ... 
    return uploads 
}; 
0

Damit werden die asynchrone Aufrufe korrekt behandeln soll und kehren alle Uploads:

getUploads() { 
    const rootDef = this.db.database.ref(); 
    const uploadsRef = rootDef.child('userUploads').orderByChild('time'); 
    const userRef = rootDef.child("userProfile"); 

    return uploadsRef.once("value").then((uploadSnaps) => { 

     return Promise.all(uploadSnaps.map(uploadSnap => { 
     var upload = uploadSnap.val(); 

     return userRef.child(uploadSnap.val().user).once("value").then((userSnap) => { 
      upload.displayName = userSnap.val().displayName; 
      upload.avatar = userSnap.val().avatar; 
      return upload; 
     });   
     })); 
    }); 
} 
+0

warten mit Uploads umgehen var? – Purus

+0

'return uploadsRef.once (" value "). dann ((uploadSnaps) [...]' gibt ein Promise an ein Array zurück, das Ihre Upload-Variable wäre. –

Verwandte Themen