2016-10-13 7 views
0

再帰関数の連鎖約束に問題があります。私の再帰関数は、同様の問題のStack Overflowの答えに似ています。問題はpromise関数の呼び出しがangular.forEachであることです。最初のものは完全に返されますが、2番目のものが実行されると "then"がヒットしますが、応答は以前の約束の値を保持しているので、同じデータを2回戻しています。 2番目の約束が解決されるまでには、それは遅すぎ、ページは既に重複した情報でレンダリングされています。AngularJs Promise "Then"約束が解決される前に火災が発生する

angular.forEach(question, function(value,key){ 
    var returnString = value.myString 
    var promise = getClusterLink(linkcodes, returnString) 
     promise.then(function (response) { 
      value.myString = response; 
      linkcount = 0; 
      }) 
     }) 

マイ再帰関数:

var thisdeferred = $q.defer(); 

function getClusterLink(linkcodes, returnString) { 
     contractorService.gethyperlink(linkcodes[linkcount]) 
     .success(function (data) { 
      var vchUrl = data[0].vchUrl; 

      var yCode = "|Y" + linkcodes[linkcount] + "~"; 
      returnString = returnString.replaceAll(yCode, vchUrl); 
      linkcount++; 
      if (linkcount < linkcodes.length) { 
       return getClusterLink(linkcodes, returnString); 
      } 
      else { 

       thisdeferred.resolve(returnString); 
      } 
     }) 

    return thisdeferred.promise; 

}; 

は私がdeferred.resolveにタイムアウトを入れてみましたが、私はまだそれだけで時間がかかり、同じ重複を取得

は、ここに私の約束関数です。どんな支援も大歓迎です!

+0

それを変更する必要がありますが、 '忘れてしまった;' 'VARの約束= getClusterLink(linkcodes、ReturnStringに)の後に' – Weedoze

+0

ええ、私は、あまりにもその時最初に考えましたセミコロンを追加しても違いはありませんでした。 –

答えて

0

これは遅延されたもので、機能の外で作成されるため、その機能を2回目に実行すると、1つの遅延は既に解決されています。

それは再帰的だとして、あなたは少しに

function getClusterLink(linkcodes, returnString) { 

    var thisdeferred = $q.defer(); 

    (function recursive(linkcodes, returnString) { 

     contractorService.gethyperlink(linkcodes[linkcount]).success(function(data) { 
      var vchUrl = data[0].vchUrl; 
      var yCode = "|Y" + linkcodes[linkcount] + "~"; 

      returnString = returnString.replaceAll(yCode, vchUrl); 

      linkcount++; 

      if (linkcount < linkcodes.length) { 
       return recursive(linkcodes, returnString); 
      } else { 
       return thisdeferred.resolve(returnString); 
      } 
     }); 

    })(linkcodes, returnString); 

    return thisdeferred.promise; 
}; 
+0

ありがとうございました!!!!それはそれを修正! –

関連する問題