2017-07-13 3 views
0

私はその理由が分かっているのを待たずに "then"の動作に問題があります。しかし、私はまだそれを回避する必要があります。 ここに私が持っているユースケースがあります。私がやっているものに".then"が解決されるのを待つ

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 
} 

問題 は「その後」の約束はdoWork2に到達する前に実行し必要がないためdoWork2で、resultOfWork1が定義されていないということです。

"then"の達成を確実にする方法はありますか? または、このやり方で何か問題がありますか?

答えて

1

連鎖約束が間違っています。

代わりのあなたにも、次のコードのために同様の変更を行う必要があり

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

OR

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

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

変更を。

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

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

、ポストでのミスのために私の悪いです。私はそれを修正した – Majid

+0

あなたはフィドルを作成できますか?正確な問題を特定するのに役立ちます。 – CuriousMind

0

問題はプロミスチェーニングではありません。 doFamilyX関数で何も返さないため、resultOfWork1が決して設定されないからです。

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 
} 

ここで、resultOfWork1引数には、parseFamilyXResultが返す値を設定する必要があります。すでにそれを行う

Angular promise chaining

関連する問題