TypeError: then 不是 JavaScript 中的函数
TypeError: then is not a function in JavaScript
then()
当在不是承诺的值上调用该方法时,会发生“TypeError: then is not a function”错误。
要解决此错误,请在调用方法之前将值转换为承诺,或确保仅then()
在有效承诺上调用方法。
下面是错误如何发生的示例。
const obj = {}; // ⛔️ TypeError: then is not a function obj.then(value => { console.log(value); });
我们在一个不是 Promise 的对象上调用了
Promise.then()
方法,所以错误发生了。
.then()
只在有效的承诺上调用方法
要解决该错误,请确保仅then()
在有效承诺上调用该方法。
const p1 = Promise.resolve('Hello'); p1.then(value => { console.log(value); // 👉️ Hello });
我们使用
Promise.resolve
方法返回一个用字符串解析的 promise Hello
。
您可以通过将承诺传递给
Promise.resolve()
方法来使用任何其他值解决承诺。
或者,您可以使用
Promise()
构造函数并resolve
手动调用该函数。
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()
下面是一个代码示例,它在调用方法之前检查该值是否是一个承诺
。
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()
对象上的方法。
这种方法称为鸭子打字。
请注意,标记为始终返回承诺的then()
方法和函数。async
结论#
then()
当在不是承诺的值上调用该方法时,会发生“TypeError: then is not a function”错误。
要解决此错误,请在调用方法之前将值转换为承诺,或确保仅then()
在有效承诺上调用方法。