2017-05-29 57 views
0

如何使下面的函數返回一個承諾,以便我可以在調用此函數的頁面中正確處理它?返回結果作爲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; 
} 

我試過以下,但它顯示錯誤。我應該如何修改?

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

我將調用此方法,如下所示。

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

回答

2

我想你可以圍繞你的方法的內容

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

這樣就解決了一個空數組。決心必須放在回調的某個地方。 –

+0

編輯答案適用於我的承諾 – user3050534

+0

它也適用於我。與迴歸承諾的使用方式有何不同? – Purus

1

您可以使用Promise.resolve

的Promise.resolve(值)方法返回一個對象承諾即用給定值解決了 。如果該值是可靠的(即,具有 「然後」方法),則返回的承諾將「跟隨」可接受的, 採用其最終狀態;否則返還的承諾將爲 ,並以此值完成。

所以乾脆:

return Promise.resolve(uploads); 

但隨着你的代碼的問題是,你返回值已調用uploadsRef.once("value").then(...)之前。
你應該簡單地從then返回結果:

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

這應該正確處理異步調用和返回所有上傳:

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

我們在哪裏處理上傳var – Purus

+0

'return uploadsRef.once(「value」)。然後((uploadSnaps)[...]'返回一個Promise給一個數組,該數組將成爲你的上傳變量。 –