2016-05-19 7 views
0

Ich habe einige typische (Anti-) Muster kombiniert, die ich gekommen bin, um Javascript unter Verwendung der Q library zu betrachten:Kann verschachtelte aufgeschobene Q-Versprechen vereinfacht werden?

Wie viel davon kann vereinfacht werden? (Oder ist sinnlos) Besonders:

  • A: Was ist der Wert in deferred.resolve(... über einen Wert zurückgibt und damit sofort zu lösen? Nur die Tatsache, dass Code, der weiter Code bekommt, ausgeführt wird, d. doSomeMore()?
  • wenn ja, für A2 ist das sinnlos in diesem Code?
  • B: Was ist der Wert in deferred.reject über throw throw new Error('')
  • C: Der try-catch ärgert mich auch. Nur um sicherzustellen, doSomeMore()?

    Funktion foo (u) {

    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

Ich bin verwirrt, was dieser Code tun soll. Außerdem wird dieser Code nicht einmal analysiert; Es gibt eine fehlende Endklammer für die 'then ('. –

+1

Willst du sagen, dass du die Antipattern absichtlich kombiniert hast? – Bergi

+0

@Bergi: Ich habe sie in existierendem Code gefunden und gedämpft, um mich auf die relevanten Teile der Probleme zu konzentrieren, die ich sehe. .. –

Antwort

0

So etwas wie dieses vielleicht?

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

Wie @Bergi darauf hinweist, vermisst dieser Code das doSomeMore() nur, wenn v ausgeführt wird ! = 42. – RamblinRose

1

Ja, der Zweck dieses Codes scheint sichergestellt werden, dass doSomeMore() ausgeführt wird, unabhängig, was passiert, wenn der Controller errichtet wurde. Sie könnten, dass mehr leicht bekommen aber:

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

@ jfriend00: Ja, 'finally' macht * immer *, das ist der ganze Punkt :-) – Bergi

+0

' return null' ist genauso gut wie 'deferred.resolve (Q (null));' '? (Das habe ich mir auch gedacht) –

+0

@FrankN: Ja, so ziemlich (vorausgesetzt, 'aufgeschoben' spielt keine Rolle) – Bergi

Verwandte Themen