使用 JavaScript 检查值是否为 Promise
要检查一个值是否为 promise,请检查该值的类型是否为对象并且是否具有名为 then 的函数类型的属性,例如 typeof p === 'object' && typeof p.then === 'function'
。 如果两个条件都返回 true,则该值是一个 promise。
function isPromise(p) {
if (typeof p === 'object' && typeof p.then === 'function') {
return true;
}
return false;
}
const p1 = new Promise(resolve => {
resolve(10);
});
console.log(isPromise(p1)); // 👉️ true
console.log(isPromise({})); // 👉️ false
我们使用逻辑与 &&
运算符来链接 2 个条件。
两个条件都必须返回真值,if 块才能运行。
所有的 promise
都有一个对象类型,所以这是我们首先要检查的。
const p1 = new Promise(resolve => {
resolve(10);
});
console.log(typeof p1); // 👉️ "object"
然后我们访问对象的 then
属性并检查它是否具有函数类型。
Promise 有 .then()
和 .catch()
方法。
这种方法称为鸭子类型。 我们基本上说 - “ 如果值是一个对象并且具有这些特定的属性/方法,那么它一定是一个
promise
”。
如果有人传入一个带有函数 then 属性的普通对象,则此条件检查将失败:
function isPromise(p) {
if (typeof p === 'object' && typeof p.then === 'function') {
return true;
}
return false;
}
console.log(isPromise({then: () => {}})); // 👉️ true
我们满足了这两个条件并得到了误报。
为了使解决方案更健壮,我们还可以添加对 catch
方法的检查。
function isPromise(p) {
if (
typeof p === 'object' &&
typeof p.then === 'function' &&
typeof p.catch === 'function'
) {
return true;
}
return false;
}
console.log(isPromise({then: () => {}})); // 👉️ false
我们添加了一个条件来检查对象是否也包含 catch
方法。
如果有人传入 null 值,该函数将返回错误。
function isPromise(p) {
if (
typeof p === 'object' &&
typeof p.then === 'function' &&
typeof p.catch === 'function'
) {
return true;
}
return false;
}
// ❌ Error: Cannot read property 'then' of null
console.log(isPromise(null));
不幸的是
,null 有一个对象类型。 这是 JavaScript 中的一个旧错误,由于向后兼容性问题尚未修复。
console.log(typeof null); // 👉️ "object"
我们可以添加一个条件来检查传入的值是否不为空。
function isPromise(p) {
if (
p !== null &&
typeof p === 'object' &&
typeof p.then === 'function' &&
typeof p.catch === 'function'
) {
return true;
}
return false;
}
console.log(isPromise(null)); // 👉️ false
const p1 = new Promise(resolve => {
resolve(10);
});
console.log(isPromise(p1)); // 👉️ true
现在我们的解决方案更强大了。 获得误报的唯一方法是传递一个对象,该对象包含名为
then()
和catch()
的方法,但不是实际的 promise。
我们的用例可能不需要这种过度设计的解决方案。 检查具有 then
方法的对象可能会很好。 我们希望解决方案的稳健程度取决于个人喜好。
相关文章
使用 CSS 和 JavaScript 制作文本闪烁
发布时间:2023/04/28 浏览次数:146 分类:CSS
-
本文提供了使用 CSS、JavaScript 和 jQuery 使文本闪烁的详细说明。
在 PHP 变量中存储 Div Id 并将其传递给 JavaScript
发布时间:2023/03/29 浏览次数:69 分类:PHP
-
本文教导将 div id 存储在 PHP 变量中并将其传递给 JavaScript 代码。
在 JavaScript 中从字符串中获取第一个字符
发布时间:2023/03/24 浏览次数:93 分类:JavaScript
-
在本文中,我们将看到如何使用 JavaScript 中的内置方法获取字符串的第一个字符。
在 JavaScript 中获取字符串的最后一个字符
发布时间:2023/03/24 浏览次数:141 分类:JavaScript
-
本教程展示了在 javascript 中获取字符串最后一个字符的方法