我对其中的一些承诺有点困惑。编写部分代码的人已经不在公司了。因此,试图理解为什么在某些地方他返回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 someValue
或return Promise.resolve(someValue)
。
在.then()
处理程序中,可以使用类似的行为执行throw someError
或return Promise.reject(someError)
。
作为一种风格偏好,我选择return someValue;
和throw someError
,因为它们对我来说似乎更简单,因为它们都不会创建另一个并不真正需要的临时promise对象。
更长的解释:
在来自.then()
处理程序的承诺链中,您只能使用return someValue
。无需执行return Promise.resolve(someValue)
。这不会伤害你,但没有必要。
在.then()
处理程序中,您有以下选项:
- 返回一个纯值
- 返回将来解决或已经解决的承诺
- 引发异常
- 返回将来拒绝或已经拒绝的承诺
在#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);