我怎么能不知道某事是否是一个承诺?

时间:2015-12-31 12:58:05

标签: javascript promise

我正在尝试获取属性的值,然后使用该值执行其他逻辑,但我想支持该属性作为承诺。在支持非承诺的同时支持这一点的最佳方式是什么?

// source can be an array of strings, a function, or a Promise
var source = this.cellProperties.source

if (typeof source === 'function') {
  sourceResult = source()
} else {
  sourceResult = source
}

sourceResult.then(function (options) {
  // perform logic with the value
  // but functions and strings don't have a `.then` property
})

我想出的最好的主意是:

if (sourceResult.then === undefined) {
  sourceResult.then = function (callback) {
    callback(sourceResult)
  }
}

但必须有一个更好的方法,不是吗?

2 个答案:

答案 0 :(得分:3)

承诺是幂等的,只需拿走你的传入价值并用它来解决新的承诺:

function foo(valueOrPromise) {
    return Promise.resolve(valueOrPromise).then(function (value) {
        console.log("the value is: " + value);
    }).catch(function (error) {
        console.error("the error is: " + error);
    });
}

答案 1 :(得分:2)

如果您不知道结果是否为Promise,您可以使用Promise.resolve()函数自行将其包装为一个函数,该函数返回已使用给定值解析的承诺。

包装一个已经是一个的承诺有一个小的(但可能是微不足道的)开销,但它本来是无害的 - 它只是解析为与原始承诺相同的值。

Promise.resolve(sourceResult).then(function (options) {
    // perform logic with the value
    ...
})

如果它是一个函数,您将需要维护现有逻辑以获得.source的结果。