调用 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"}

}


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


四季花海
浏览 331回答 1
1回答

精慕HU

something.then(Promise.reject)获取对拒绝方法的引用并仅传递该函数引用。它不再与Promise对象有任何联系。这意味着调用this该reject()方法时的值将不正确,并且不允许这样做。正如帕特里克在评论中提到的,这与你不能这样做的原因是一样的:let reject = Promise.reject; reject("whatever");方法需要使用其对象的上下文来调用,除非它们专门设计为不需要其对象的上下文(有一些实例)。如果你想要一个快捷方式,你可以这样做:something.then(Promise.reject.bind(Promise))这会将Promise对象绑定到方法(通过本质上创建一个将其调用为 的存根函数Promise.reject())。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript