Javascript - если с асинхронным регистром

1

Мой вопрос немного касается концепции.

Много раз возникает такая ситуация:

if(something){
    someAsyncAction();
}else{
    someSyncAction();
}

// Continue with the rest of code..
var a = 5;

Проблема с этим случаем очевидна, я не хочу, чтобы вызов var a = 5 вызывался, если не будет выполнено someAsyncAction() или someSyncAction(), теперь причина soAsyncAction() является асинхронным единственным способом (я могу думать of), чтобы решить эту ситуацию:

var after = function(){
    // Continue with the rest of code..
    var a = 5;
}

if(something){
    someAsyncAction(after);
}else{
    someSyncAction();
    after ();
}

НО, этот код является уродливым, трудно читаемым и выглядит как анти-шаблон и проблема.

Я пытаюсь подумать, может быть, я смогу найти какое-то решение для этого с помощью Promises (используя Bluebird на бэкэнд), но не могу найти что-то.

Кто-нибудь сталкивался с этим раньше и может помочь мне понять это?

Спасибо!

  • 1
    Беспорядок с AsyncAction и SyncAction для меня тоже выглядит как анти-паттерн.
  • 0
    Может быть уродливым, если вы хотите, но это способ определения и использования обратных вызовов javascript. Я не знаю другого способа работать асинхронно. О, и это вовсе не анти-паттерн, это ЭТО паттерн.
Показать ещё 4 комментария
Теги:
design-patterns
asynchronous
promise
anti-patterns

1 ответ

4

С promises у вас будет аналогичный шаблон, как и с обратным вызовом, только сначала вы сохраните результат и не будете дважды/дважды обращать обратный вызов:

function after(result) {
    // Continue with the rest of code..
    var a = 5;
}
var promise;
if (something){
    promise = someAsyncAction();
} else {
    promise = Promise.resolve(someSyncAction());
}
promise.then(after);

Или, короче говоря, вы бы использовали условный оператор и структурировали его гораздо проще:

(something
  ? someAsyncAction()
  : Promise.resolve(someSyncAction())
).then(function(result) {
    // Continue with the rest of code..
    var a = 5;
});
  • 0
    Я только что узнал, что троичный оператор также называется условным оператором. С другой стороны, как только оператор yield будет широко поддерживаться, result = something? yield someAsyncAction() : someSyncAction() будет возможно до тех пор, пока он вызывается в контексте управляемого генератора.
  • 0
    @plalx: будет yeld ключевое слово yeld иметь то же значение, что и в python, где используется для создания генераторов?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню