2017-09-29 7 views
-1

私はAngularの約束を理解しようとしています。しかし、私はまだコンセプトを混ぜています。アンギュラ1.0.7に次の例を見てください:AngularJSの約束を理解する

var initLocale = function(language) { 
    return $translate.uses(language); 
}; 

そして、このコードではありません:

// After locale is set code should be executed 
initLocale(language).then(function (result) {    
    console.log("Insert code here"); 
}); 

誰かが、このコードが動作している理由を私は理解するのに役立つことができ

var initLocale = function(language) { 
    $translate.uses(language).then(function(result) { 
     // I need to do things here! For example call another 
     // Asynchronous function. 
     tmhDynamicLocale.set(language).then(function() {   
       console.log("Locale started!");              
      }); 
     return result;                  
    }); 
}; 
+0

を、initLocaleは約束を返しています。しかし、非実例では、initLocaleはその約束の結果を返しています。 – xpander001

+0

そして、約束を返すがコードを内部で実行するにはどうすればよいですか? – Rober

+0

動作していない例では、 'initLocale'関数は何もそれ自身を' return'しません。 – Bergi

答えて

1

$translate.uses(language)返品Promise。

ここをクリックしてください!たとえば、別の非同期関数を呼び出します。

あなたはtmhDynamicLocale.set(language)resultsを解決したい場合は - 約束のチェーンを使用します。作業の例で

var initLocale = function(language) { 

    var data = {}; 

    return $translate.uses(language).then(function(result) { 
     data.result = result;    
     return tmhDynamicLocale.set(language); 
     }).then(function() { 
      // do your stuff here  
      return data.result;                
     });                       
}; 

Simple Demo Fiddle

+1

[遅延反パターン](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)を避けてください! – Bergi

+1

はい、私は悪い習慣であるので、私はそれをdownvotedしました(そしてリンクされたトピックが説明するように、それは拒絶のために働くことさえありません)。角度のある文書が悪い習慣としてそれをリストアップしていないということは、それが大丈夫であるということを意味するものではありません。はい、一般的に繰延を避けるべきではありませんが、ここで*避けるべきです*。 – Bergi

+0

@Bergi ok、変更、tnx –

1

最初のの例では、promiseが返されました。

第2の例では、callback関数内のreturnステートメントを使用しましたが、それは間違っています。

.set非同期機能が終了する前にreturn result行が実行されているためです。

あなたはconsole.log(result)return result;を交換した場合、あなたはconsole.log("Locale started!")結果を受けていることがわかります。

はさらにもっと、.then方法はpromise結果を処理するために使用されているので、あなたが機能しますからpromiseを返却する必要があります。

+0

いいえ、ソリューションはコールバック関数ではありません。解決策は、 'initLocale'のシグネチャを変更することなく、約束を返すことです。 – Bergi

+0

@Bergi、OPは「誰かがこのコードがなぜ動作しているのか、このコードがなぜそうでないのか理解できるようになるの?私の答えは最初の作品と2番目の作品が正しくない理由を正しく説明しています。 –

+0

@Bergi、私は 'alternative solution'に変更しました。 –