我有一个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的情况下,我返回了一条简单的错误消息。但是,如果存在,它将返回承诺。为了使它们一致,我希望将对象作为承诺返回,即使它没有等待任何事情。
如果这是一种不错的方法,我该如何实现?
答案 0 :(得分:1)
有两种方法:
如果启动操作的代码甚至无法启动它,则抛出错误是合理的。那将是同步的。
在异步过程已经在进行并且正在执行此操作的情况下,或者如果您只是简单地希望函数从不抛出并且总是返回promise,请使用Promise.reject
:
return Promise.reject(new Error("Item missing"));
(不必与Error
一起使用Promise.reject
,就像您不必与throw
一起使用,但这是两种情况下的最佳做法。)
对getFollowers
的另外两条评论:
通常,如果您已经可以使用,例如在这种情况下,请不要使用this.db.collectionGroup
中的new Promise
。只是从那个承诺链。有关详细信息,请参见this question's answers。
我在您的问题中看到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"}
}
}