2017-07-13 4 views
0

Ich habe Probleme mit dem Verhalten von "dann" nicht gewartet, für die ich den Grund verstehe. Trotzdem muss ich mich darum kümmern. Hier ist der Anwendungsfall, den ich habe.Warten auf ".then" gelöst zu werden

doWork(family) { 
    return doWork1(family) 
      .then(resultOfWork1 => doWork2(resultOfWork1)); 
} 

doWork1(family) { 
    if (1 === family) { 
     return doFamily1(); 
    } else { 
     return doFamily2(); 
    } 
} 

doFamily1() { 
    return $http(urlToFamily1) 
      .then(response => parseFamily1Result(response)); 
} 

parseFamily1Result(response) { 
    return parsed response in a family1 way; 
} 

doFamily2() { 
    return $http(urlToFamily2) 
      .then(response => parseFamily2Result(response)); 
} 

parseFamily2Result(response) { 
    return parsed response in a family2 way; 
} 

doWork2(resultOfWork1) { 
    // use resultOfWork1 
} 

Das Problem in dem, was ich tue, dass in doWork2, resultOfWork1 da die nicht definiert ist „dann“ Versprechen vor dem Erreichen doWork2 ausgeführt ist nicht erforderlich.

Gibt es eine Möglichkeit, die Erfüllung von "dann" zu gewährleisten? Oder stimmt etwas nicht mit dieser Art von Dingen?

Antwort

1

Sie haben Versprechen falsch verkettet.

Statt

doWork(family) { 
    return doWork1(family) 
      .then(doWork2(resultOfWork1)); 
} 

Änderung es

doWork(family) { 
    return doWork1(family) 
      .then(function(resultOfWork1){ doWork2(resultOfWork1); }); 
} 

ODER

doWork(family) { 
    return doWork1(family) 
      .then(doWork2); 
} 

Sie müssen auch ähnliche Änderungen für den folgenden Code tun.

$http(urlToFamily1) 
      .then(parseFamily1Result(response)); 

$http(urlToFamily2) 
      .then(parseFamily2Result(response)); 
+0

Schon das zu tun, mein schlecht für den Fehler in der Post. Ich habe es behoben – Majid

+0

können Sie eine Geige erstellen? Es wird helfen, genaues Problem zu lokalisieren. – CuriousMind

0

Ihr Problem ist nicht die Verheißung Verkettung. Es ist einfach so, weil Ihr resultOfWork1 nie gesetzt wird, weil Sie in Ihren doFamilyX-Funktionen nichts zurückgeben.

doWork(family) { 
    return doWork1(family) 
      .then(resultOfWork1 => doWork2(resultOfWork1)); 
} 

doWork1(family) { 
    if (1 === family) { 
     return doFamily1(); 
    } else { 
     return doFamily2(); 
    } 
} 

doFamily1() { 
    return $http(urlToFamily1) 
      .then(response => return parseFamily1Result(response)); //return the result 
} 

parseFamily1Result(response) { 
    return parsed response in a family1 way; 
} 

doFamily2() { 
    return $http(urlToFamily2) 
      .then(response => return parseFamily2Result(response)); //return the result 
} 

parseFamily2Result(response) { 
    return parsed response in a family2 way; 
} 

doWork2(resultOfWork1) { 
    // use resultOfWork1 
} 

Jetzt sollte Ihr resultOfWork1-Argument auf den von parseFamilyXResult zurückgegebenen Wert festgelegt werden.

Angular promise chaining

Verwandte Themen