返回Promise.resolve或仅在Promise链中返回



我对其中的一些承诺有点困惑。编写部分代码的人已经不在公司了。因此,试图理解为什么在某些地方他返回Promise.resolve(data),而在某些地方它只返回return data。下面是一个示例promise链和在promise链中调用的函数。

let experimentFunc = function(data) {
if(data && data.length <= 100) {
return Promise.resolve(data); //<- should this be Promise.resolve or can it just be return data
} else if(data.length > 500) {
return Promise.reject(data); //<- since we want to reject on error, this should be ok.
} else {
return data //<- should this be return Promise.resolve(data) or since its part of the promise chain, there is no need to do Promise.resolve, instead just return?
}
}
Somefunc.method(data)
.then(experimentFunc)
.then(successResponse)
.catch(error);

简短摘要:

.then()处理程序中,可以使用类似的行为执行return someValuereturn Promise.resolve(someValue)

.then()处理程序中,可以使用类似的行为执行throw someErrorreturn Promise.reject(someError)

作为一种风格偏好,我选择return someValue;throw someError,因为它们对我来说似乎更简单,因为它们都不会创建另一个并不真正需要的临时promise对象。


更长的解释:

在来自.then()处理程序的承诺链中,您只能使用return someValue。无需执行return Promise.resolve(someValue)。这不会伤害你,但没有必要。

.then()处理程序中,您有以下选项:

  1. 返回一个纯值
  2. 返回将来解决或已经解决的承诺
  3. 引发异常
  4. 返回将来拒绝或已经拒绝的承诺

在#1中,promise链立即前进,您的返回值作为链中下一步的链的解析值,因此return someValue等效于return Promise.resolve(someValue);

在#2和#4中,如果承诺尚未实现,父承诺链将等待承诺拒绝/解决,然后再向下推进承诺链。

在#3中,您所在的.then()处理程序将捕获异常,然后拒绝承诺链,因此.then()处理程序中的throw error的行为与return Promise.reject(error);等效。


用你的例子,我会选择这种风格:

let experimentFunc = function(data) {
if (typeof data === "object" && data.hasOwnProperty("length")) {
if (data.length > 500) {
throw new Error("data length too long", {cause: data});
}
return data;
}
// didn't get any data object here
throw new Error("Missing data", {cause: data});
}
Somefunc.method(data)
.then(experimentFunc)
.then(successResponse)
.catch(error);

相关内容

  • 没有找到相关文章

最新更新