我正在尝试获取属性的值,然后使用该值执行其他逻辑,但我想支持该属性作为承诺。在支持非承诺的同时支持这一点的最佳方式是什么?
// 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)
}
}
但必须有一个更好的方法,不是吗?
答案 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
的结果。