2014-12-11 2 views
1

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

var deferred = $q.defer(); 
//...make use of the deferred 
return deferred.promise; 

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

например. будет ли это идиоматично?

if (shouldShortcut) { 
    return $q.when(true); 
} 
+0

Так 'Q' не имеют эквивалента' Promise.resolve (значение) '? Глядя на документ 'Q (value)' должен создать решение Promise? '[...] Если значение не является обещанием, возвращает обещание, которое выполняется со значением. [...]' –

+0

@zerkms: Eh, nope. – Cerbrus

+0

@ t.niese 'Q' действительно имеет' Q.Promise.resolve() ', но' $ q' не появляется. – JLRishe

ответ

2

Вы можете просто решить отсроченной сразу, но все-таки вернуть свое обещание:

if (shouldShortcut) { 
    deferred.resolve(); 
    return deferred.promise; 
} 
+0

Будет ли это сохранять асинхронную семантику? т. е. будет ли следующий 'then' (или' finally') на следующий тик, или он будет немедленно продолжать текущий тик (учитывая, что он был немедленно разрешен)? – Ben

+1

Его ответ '$ q.when (true)' лучше, хотя - нет необходимости включать отложенную. Следующий 'then' или' finally' будет происходить на следующем тике, а не сразу (происшествие немедленно было бы безумным, поскольку это вызвало бы проблемы гонки и проблемы синхронизации). –

+0

* ... и не сразу * - на самом деле я думал, что это было намерение.) – raina77ow

2

Edit: Теперь я вижу, что вы говорите о $ д, а не Q. Ниже перерыва для моего предыдущего ответа, поскольку он относится к библиотеке Q.

Основываясь на комментарий Benjamin Gruenbaum в поле ниже (который с тех пор он удален), $q.when() прекрасный способ сделать это:

var resolvedPromise = $q.when(); 

Вы можете решить с определенным значением, передавая, что в when():

var resolvedPromise = $q.when("all good"); 

Здесь не нужно включать отсрочки. Фактически, я бы предложил ограничить использование вами отсрочек, так как они, скорее всего, скоро будут проходить в пользу revealing constructor pattern, который используется в ES6.


(предыдущий ответ)

Библиотека Q обеспечивает способ сделать это, что согласуется с ES6 обещает стандарт:

Q.Promise.resolve(); 

это дает разрешенную обещание.

Если вы хотите разрешить его с определенным значением, вы можете передать это значение:

Q.Promise.resolve("all good"); // promise resolved with the value "all good" 
+0

@BenjaminGruenbaum Я не знал, что '$ q.when (« all good »)' было идиоматическим использованием '$ q.when()', поскольку я думал, что его целью было обернуть потенциально непредсказуемые значения. Но если вы за это, то я тоже. – JLRishe

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