TypeError: then 不是 JavaScript 中的函数

TypeError: then 不是 JavaScript 中的函数

TypeError: then is not a function in JavaScript

then()当在不是承诺的值上调用该方法时,会发生“TypeError: then is not a function”错误。

要解决此错误,请在调用方法之前将值转换为承诺,或确保仅then()在有效承诺上调用方法。

typeerror then 不是一个函数

下面是错误如何发生的示例。

索引.js
const obj = {}; // ⛔️ TypeError: then is not a function obj.then(value => { console.log(value); });

我们在一个不是 Promise 的对象上调用了
Promise.then()
方法,所以错误发生了。

.then()只在有效的承诺上调用方法

要解决该错误,请确保仅then()在有效承诺上调用该方法。

索引.js
const p1 = Promise.resolve('Hello'); p1.then(value => { console.log(value); // 👉️ Hello });

我们使用
Promise.resolve
方法返回一个用字符串解析的 promise
Hello

您可以通过将承诺传递给
Promise.resolve()方法来使用任何其他值解决承诺。

或者,您可以使用
Promise()
构造函数并
resolve手动调用该函数。

索引.js
function sum(a, b) { return new Promise((resolve, reject) => { resolve(a + b); }); } sum(5, 5).then(result => { console.log(result); // 👉️ 10 });

构造Promise()函数还返回一个 promise 对象,但就我们的目的而言,它比Promise.resolve()直接调用该方法要冗长一点。

在调用之前检查该值是否为 Promise .then()

如果错误仍然存​​在,console.log请检查您正在调用该then()
方法的值并确保它是一个承诺。

then()下面是一个代码示例,它在调用方法之前检查该值是否是一个承诺

索引.js
const p1 = null; if (typeof p1 === 'object' && p1 !== null && 'then' in p1) { p1.then(value => { console.log(value); }); }
我们的if条件使用逻辑与 (&&) 运算符,因此要运行该块,必须满足所有条件。 if

我们首先检查p1变量是否存储了类型为的值,object
因为 promises 的类型为
object

然后我们检查该值是否不等于null不幸的是,如果您使用 来检查 null 的类型console.log(typeof null),您将得到一个"object"
值,因此我们必须确保该值不是
null

我们检查的最后一件事是对象包含then属性。

然后我们知道我们可以安全地调用then()对象上的方法。

这种方法称为鸭子打字。

使用 duck-typing 时,我们只需检查对象是否实现了特定的属性或方法,如果实现了,我们就假定它是正确类型的对象。

请注意,标记为始终返回承诺的then()方法和函数。async

结论#

then()当在不是承诺的值上调用该方法时,会发生“TypeError: then is not a function”错误。

要解决此错误,请在调用方法之前将值转换为承诺,或确保仅then()在有效承诺上调用方法。