2016-07-26 14 views
1

私は、約束のデータと簡単な数学の値の組み合わせであるデータを持つ関数を持っています。ここでは機能があります:AngularJS:約束のデータと約束していないデータを持つ関数

_getTotalPrice = function() { 

      var price = 0; 
      // Simple Math data. 
      // Calculate price for channels first. 
      price = price + (num_channels - 5)*(4); 


      var themepacks = cart.themepacks; 
      if(themepacks) { 
       angular.forEach(themepacks, function(pack, index) { 

       // data coming from a service 
       channelFactory.getThemePack(pack).then(function(result) { 
        price = price + Number(result.packPriceAmt); 
        console.log("price", price); 
        }); 
       }); 
      } 

      console.log(" Total price", price); 
      return price; 
}; 

ページのロード時に、Total pricepriceの値が異なっています。約束が解決された後にpriceが読み込まれたためです。値を返す前に約束が解決されるまで私はどのように待つことができますか?私はこの機能の中で別の約束を作りますか?

+1

あなたは$ qを見ていたしましたか? http://www.codeducky.org/q-serial/または他の例を参照してください。 – Naveen

+2

関数内で値を返すことはできません。それは 'return'とともに返されるか、' undefined'が暗黙的な返り値として返されます。値を返す約束を返します。 – estus

答えて

1

関数は、作成された約定の解像度のすべて(all)に依存する総価格の約束を返さなければなりません。

まず、少しファクタリングは、それが明確にアップするのに役立ちます:

// return a promise for a theme pack price 
function priceOfPack(pack) { 
    return channelFactory.getThemePack(pack).then(function(result) { 
     return Number(result.packPriceAmt); 
    }); 
} 

これは、我々は非同期的に価格のセットを収集するつもりだという考えより明確になります。今、ループは簡単です...

_getTotalPrice = function() { 
    var themepacks = cart.themepacks || []; 
    var promises = []; 
    angular.forEach(themepacks, function(pack, index) { 
     promises.push(priceOfPack(pack)); 
    }); 
    var basePrice = (num_channels - 5) * 4; 

    // when all promises are resolved, they will be with an array of prices 
    return $q.all(promises).then(function(result) { 
     return result.reduce((a, b) => { a + b }, basePrice); 
    }); 
} 

呼び出し側は、新たな機能が約束を返すことを認識し、それに応じて変更する必要があり、そう...

_getTotalPrice().then(function(result) { 
    // result is the totalPrice 
}); 
+0

'if(!themepacks)'についてはどうですか? – charlietfl

+0

@charlietfl、はい、私は_getTotalPriceメソッド全体を提供しませんでした。約束だけに関連するビット。 – danh

+0

推測OPは、他の条件のために返された別の約束が必要であることを知らない – charlietfl

1

これを試してみてください:

_getTotalPrice = function() { 

      var price = 0; 
      // Simple Math data. 
      // Calculate price for channels first. 
      price = price + (num_channels - 5)*(4); 


      var themepacks = cart.themepacks; 
      if(themepacks) { 
       angular.forEach(themepacks, function(pack, index) { 

       // data coming from a service 
       return channelFactory.getThemePack(pack).then(function(result) { 
        price = price + Number(result.packPriceAmt); 
        return $q.when(price); 
        }); 
       }); 
      } 
      else{ 
       return $q.when(price); 
      } 
}; 

_getTotalPrice().then(function(price){ 
    console.log(price); 
}); 

それは、非同期機能でしょう。

+0

forEachの中のreturnは何もせず、そのループによって作成された約束事が必要です。 ますreturn $ q.all(約束).then(関数(結果){ angular.forEach(結果、機能(:ソリューションは、ああ、私は彼がforEachの はそう代わりにuはこれを使用する必要がありましたことを見逃し – charlietfl

+0

動作しません。結果){ price = price + number(result.packPriceAmt); }); return $ q.when(price); }); – uamanager

+0

コメントの投稿はありません...ただ更新の回答 – charlietfl

関連する問題