javascript - 调用 something.then(Promise.reject) 结果错误,为什么速记不起作用
问题描述
请看这个最小的例子:
我有这样的数据:
const testObject = { test: 'foo' };
我的主要功能是:
导致错误
// This cause error
function handleResponse(response) {
return response.json().then(Promise.reject); // Please notice this line
}
try {
await handleResponse({
json: () => Promise.resolve(testObject),
});
} catch (err) {
console.log(err);
// => TypeError: PromiseReject called on non-object
}
这个有效:
正确的
// This works
function handleResponse(response) {
return response.json().then((res) => Promise.reject(res)); // Please notice this line
}
try {
await handleResponse({
json: () => Promise.resolve(testObject),
});
} catch (err) {
console.log(err);
// => {test: "foo"}
}
为什么会这样?我错过了什么?
解决方案
something.then(Promise.reject)
获取对拒绝方法的引用并仅传递该函数引用。它不再与Promise
对象有任何联系。这意味着调用this
该方法时的值reject()
将不正确,并且不允许这样做。
正如帕特里克在评论中提到的,这与您不能这样做的原因相同:
let reject = Promise.reject;
reject("whatever");
方法需要使用其对象的上下文来调用,除非它们专门设计为不需要其对象的上下文(有一些实例)。
如果你想要一个快捷方式,你可以这样做:
something.then(Promise.reject.bind(Promise))
这会将Promise
对象绑定到方法(通过本质上创建一个将其调用为的存根函数Promise.reject()
)。
其他相关答案:
推荐阅读
- javascript - 如何使用 JavaScript 获取 div 中的字符数(忽略空格)?
- java - CassandraRepository 如何获得分配的连接配置?
- cypress - 使用 Cypress 监视画布上下文方法
- python - 用于定义函数以查找给定列表的第一个倒数和中间值的 Python 代码
- electron - Electron Web 蓝牙 API requestDevice() 错误
- java - 无法连接到 Mariadb Xampp 数据库
- python - 在 readlines() 之后添加 1 个单词
- error-handling - 为什么?操作员报告错误“特征绑定NoneError:不满足错误”?
- python - 在 matplotlib 图表中显示的不仅仅是 x、y、值
- android - 在 LiveData 上应用 Transformation.map