是否有一种简单而优雅的方法来确定变量是否是javascript(es6)中的promise或object?
我有一个变量
let payment;
并且在应用程序中,它可以是具有实际值的promise或object。我知道我可以测试它包含一些属性,如
if (payment.amount)
但这对我来说似乎不是一个优雅的解决方案,因为属性(数据结构)可以及时改变。直到现在我正在使用
if (typeof payment === 'object')
但我刚想通了,承诺基本上也是对象。所以这种情况总是如此。
是否可以判断它是真实数据的承诺还是对象?
答案 0 :(得分:11)
不要试图找出答案。只是让它永远是一个承诺。
payment = Promise.resolve(payment);
Promise.resolve
创建一个新的promise对象。如果传递的值本身就是一个promise,则在原始值被解析或拒绝时。如果是其他任何内容,则立即使用该值解决新承诺。
答案 1 :(得分:4)
与所有其他原生对象一样,您可以将instanceof
与Promise
构造函数一起使用:
if (payment instanceof Promise)
但是,如果您不知道它是原生承诺还是来自自定义库,您通常会想要检查thenable是否有.then
方法
但你真的不需要区分它们(除了调试目的)。如果有可能某事是承诺,那么总是需要等待,并且无论如何都要从中构建承诺。您不需要自己做区分,您可以使用Promise.resolve
将承诺,可信或明确的对象转换为您喜欢的实现的承诺 - 这就是Promise互操作性的设计方式首先,它绝对有用。
const promise = Promise.resolve(payment).then(value => {
// value: always a plain value
}); // promise: always a promise
答案 2 :(得分:3)
检查它是否具有属性<td>
<input
id="qinput-xxx"
data-link="http:xxxx"
data-item-id="xxx"
data-cart-item-id="xxxx"
class="qty cart-item-quantity input-text" name=""
value="1"
/>
<button id="qbutton-xxx"
data-item-id="xxx"
disabled="disabled"
data-update
data-cart-item-update
class="button quantity-button">
ok
</button>
</td>
的属性:
then
据我所知,这是检查某些东西是否是承诺(或类似“承诺”)的唯一正确方法,同时考虑到所有不同的可能承诺实施。
答案 3 :(得分:0)
payment instanceof Promise
或者这个:
payment.constructor.toString().indexOf('Promise') > -1
答案 4 :(得分:0)
python manage.py makemigrations catalog
答案 5 :(得分:0)
如果您担心在普通的await
(而不是function
)上使用Promise
,则可以在ES6中这样做。 await
被忽略-不引发错误。
这可能会解决您真正在所有上进行比较的需要(就像我第一次发现此问题时的情况一样)