2016-05-19 4 views
0

Я объединил некоторые типичные (анти-) рисунки, которые я придумал, глядя на javascript, используя Q library:Можно ли упростить вложенные отложенные Q Promises?

Насколько это можно упростить? (Или не имеет смысла) Тем:

  • A: Какое значение в deferred.resolve(... над возвращающая значение и, таким образом, решения сразу же? Только тот факт, что код, который добавляет следующий код, выполняется, т.е. doSomeMore()?
  • если да, то для A2 это бессмысленно в этом коде?
  • B: Что такое значение в deferred.reject над throw throw new Error('')
  • C: попытка прилов также раздражает меня. Только для обеспечения doSomeMore()?

    функция Foo (и) {

    var deferred = Q.defer(); 
    
    bar(u).then(function (v) { 
    
        if (v==42) { 
         deferred.resolve(Q(null)); // A 
        } else { 
         try { 
          var controller = new Controller(); 
          deferred.resolve(controller); // A2 
         } 
         catch (error) { 
          deferred.reject(error);  // B,C 
         } 
    
         doSomeMore(); 
        } 
    
        return deferred.promise; 
    }); 
    

    }

+0

Я смущен относительно того, что этот код должен делать. Кроме того, этот код даже не будет разбираться; есть недостающая конечная скобка для 'then ('. –

+1

Вы говорите, что вы специально объединили антипаттерны? – Bergi

+0

@Bergi: У меня есть _found_ их в существующем коде и затухал, чтобы сосредоточиться на соответствующих частях проблем, которые я вижу. .. –

ответ

0

Нечто подобное может быть?

return bar(u).then(function (v) {  
    if (v==42) 
    return null; 
    return new Controller(); 
}).finally(function() { doSomeMore(); }); 
+0

Как отмечает @Bergi, этот код пропускает doSomeMore(), выполняемый только тогда, когда v ! = 42. – RamblinRose

1

Да, цель этого кода, кажется, гарантируя, что doSomeMore() выполняется независимо, что произошло, когда Controller был построен. Вы могли бы получить, что более легко, хотя:

function foo(u) { 
    return bar(u).then(function (v) { 
     if (v == 42) { 
      return null; 
     } else { 
      try { 
       return new Controller(); 
      } finally { 
       doSomeMore(); 
      } 
     } 
    }); 
} 
+0

@ jfriend00: Да, 'finally' does * always * execute, вот и вся его цель :-) – Bergi

+0

' return null' так же хорош, как 'deferred.resolve (Q (null));'? (Это то, о чем я и думал) –

+0

@FrankN: Да, в значительной степени (предполагая, что 'отложенный' не имеет значения) – Bergi

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