ES6 - 决定对象还是承诺

时间:2017-03-26 20:12:09

标签: javascript ecmascript-6 promise

是否有一种简单而优雅的方法来确定变量是否是javascript(es6)中的promise或object?

我有一个变量

let payment;

并且在应用程序中,它可以是具有实际值的promise或object。我知道我可以测试它包含一些属性,如

if (payment.amount)

但这对我来说似乎不是一个优雅的解决方案,因为属性(数据结构)可以及时改变。直到现在我正在使用

if (typeof payment === 'object')

但我刚想通了,承诺基本上也是对象。所以这种情况总是如此。

是否可以判断它是真实数据的承诺还是对象?

6 个答案:

答案 0 :(得分:11)

不要试图找出答案。只是让它永远是一个承诺。

payment = Promise.resolve(payment);

Promise.resolve创建一个新的promise对象。如果传递的值本身就是一个promise,则在原始值被解析或拒绝时。如果是其他任何内容,则立即使用该值解决新承诺。

答案 1 :(得分:4)

与所有其他原生对象一样,您可以将instanceofPromise构造函数一起使用:

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被忽略-不引发错误。

这可能会解决您真正在所有上进行比较的需要(就像我第一次发现此问题时的情况一样)