2017-05-29 58 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给一个数组,该数组将成为你的上传变量。 –