2015-12-31 3 views
0

Я пытаюсь получить значение свойства, а затем выполнить другую логику со значением, но я хотел бы поддержать это свойство, являющееся обещанием. Каков наилучший способ поддержать это, все еще поддерживая не обещания?Как я должен быть агностик о том, что обещание?

// 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) 
    } 
} 

Но должен быть лучше, чем подход, что, нет?

+1

Просто сделайте 'sourceResult' обещание, используя' Promise.resolve'. – Bergi

+1

Честно говоря, реальное решение здесь заключается в том, чтобы не допускать трех разных типов ввода в функции. Определенно, не идете с идеей реализации обещаний (в некоторых случаях это разрывается). –

ответ

2

Если вы не знаете, является ли результат является Promise вы можете обернуть его в одном самостоятельно, используя Promise.resolve() функция, которая возвращает обещание, которое уже разрешено с заданным значением.

Есть незначительные (но, возможно, незначительные) накладные расходы, обертывая обещание, которое уже одно, но оно в противном случае безвредно - оно просто решает ту же ценность, что и первоначальное обещание.

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

Вам нужно будет поддерживать существующую логику, чтобы получить результат .source, если это функция.

+0

Э-э ... это именно то, что мой ответ говорит, через 10 минут после того, как я опубликовал, и мы это обсудили. Это не круто. – Tomalak

+0

Я разместил его, потому что я чувствовал, что ваша дополнительная функция 'foo' была чрезмерной в данных обстоятельствах - лучше просто включить вызов' Promise.resolve() ' – Alnitak

+0

(и потому, что я думаю, что это более четкое объяснение) – Alnitak

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); 
    }); 
} 
+0

, который не будет работать для случая, когда данный вход является функцией - ему все еще потребуется дополнительная логика для этого – Alnitak

+0

Не уверен, что вы имеете в виду, конечно, он будет работать: 'foo (this.cellProperties.source). Then (что угодно): «Строго говоря, функция даже не нужна, достаточно простого« Promise.resolve (this.cellProperties.source) ». – Tomalak

+0

'.source' может быть функцией – Alnitak

Смежные вопросы