【问题标题】:Calling something.then(Promise.reject) result error, Why short hand not working调用 something.then(Promise.reject) 结果错误,为什么速记不起作用
【发布时间】:2019-07-24 04:30:01
【问题描述】:

请看这个最小的例子:

我有这样的数据:

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

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

【问题讨论】:

  • 同样的原因var reject = Promise.reject; reject({ test: 'foo' }) 不起作用。

标签: javascript node.js


【解决方案1】:

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

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

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

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

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

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

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

其他相关答案:

Why does this throw an undefined exception?

When you pass 'this' as an argument

Object methods assigned to variables or function arguments fail when invoked

Assiging a method to a variable in Javascript

Uncaught TypeError: this.method is not a function - Node js class export

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多