如何将返回的对象转换为带有该对象的Promise?

时间:2019-06-07 17:07:49

标签: javascript object promise es6-promise

我有一个API调用,它返回一个Promise或一个带有信息的对象。

getFollowers(uid, auth){
    if(uid){
      var followersPromise =  this.db.collectionGroup(`following`)
      ....
      })
        .catch(function(error) {
          ...
      });
      return followersPromise
    }else{
      return {success: 0, error: "Item missing"}
    }
  }

在未提供uid的情况下,我返回了一条简单的错误消息。但是,如果存在,它将返回承诺。为了使它们一致,我希望将对象作为承诺返回,即使它没有等待任何事情。

如果这是一种不错的方法,我该如何实现?

2 个答案:

答案 0 :(得分:1)

有两种方法:

  1. 如果启动操作的代码甚至无法启动它,则抛出错误是合理的。那将是同步的。

  2. 在异步过程已经在进行并且正在执行此操作的情况下,或者如果您只是简单地希望函数从不抛出并且总是返回promise,请使用Promise.reject

    return Promise.reject(new Error("Item missing"));
    

(不必与Error一起使用Promise.reject,就像您不必与throw一起使用,但这是两种情况下的最佳做法。)


getFollowers的另外两条评论:

  1. 通常,如果您已经可以使用,例如在这种情况下,请不要使用this.db.collectionGroup中的new Promise。只是从那个承诺链。有关详细信息,请参见this question's answers

  2. 我在您的问题中看到getFollowers有一个.catch处理程序。如果函数返回promise,那通常是不合适的。只需允许错误传播即可。

因此,如果您想在甚至无法启动操作时执行同步错误:

getFollowers(uid, auth){
    if(!uid){
        throw new Error("Item missing");
    }
    return this.db.collectionGroup(`following`)
        // ....
    });
}

如果您更喜欢使用被拒绝的承诺:

getFollowers(uid, auth){
    return !uid
        ? Promise.reject(new Error("Item missing"))
        : this.db.collectionGroup(`following`)
            // ....
        });
}

答案 1 :(得分:0)

这就是Promise.resolve的作用:

 return Promise.resolve({success: 0, error: "Item missing"});

或者您可以使函数异步:

 async getFollowers(uid, auth){
   if(uid) {
     try {
      const result =  await this.db.collectionGroup(`following`);
      return result;
     } catch(error) {
       //  ...
     }
  } else {
    return {success: 0, error: "Item missing"}
  }
}