首页 > 解决方案 > 调用 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"}
}

为什么会这样?我错过了什么?

标签: javascriptnode.js

解决方案


something.then(Promise.reject)获取对拒绝方法的引用并仅传递该函数引用。它不再与Promise对象有任何联系。这意味着调用this该方法时的值reject()将不正确,并且不允许这样做。

正如帕特里克在评论中提到的,这与您不能这样做的原因相同:

let reject = Promise.reject;
reject("whatever");

方法需要使用其对象的上下文来调用,除非它们专门设计为不需要其对象的上下文(有一些实例)。

如果你想要一个快捷方式,你可以这样做:

something.then(Promise.reject.bind(Promise))

这会将Promise对象绑定到方法(通过本质上创建一个将其调用为的存根函数Promise.reject())。

其他相关答案:

为什么这会引发未定义的异常?

当您将“this”作为参数传递时

分配给变量或函数参数的对象方法在调用时失败

将方法分配给 Javascript 中的变量

未捕获的类型错误:this.method 不是函数 - 节点 js 类导出


推荐阅读