繁体   English   中英

在Typescript中以承诺的形式返回结果

[英]Returning results as a promise in Typescript

如何使下面的函数返回一个Promise,以便可以在调用此函数的Page中正确处理它?

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);
});

我想你可以围绕你的方法的内容

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

您可以使用Promise.resolve

Promise.resolve(value)方法返回使用给定值解析的Promise对象。 如果该值是一个thenable(即具有“ then”方法),则返回的Promise将“跟随”该thenable,并采用其最终状态; 否则,返回的承诺将被履行。

如此简单:

return Promise.resolve(uploads);

但是代码的问题是,在uploadsRef.once("value").then(...)之前返回该值。
您应该简单地then返回结果:

return uploadsRef.once("value").then((uploadSnaps) => {
    ...
    return 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;
        });        
      }));
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM