2017-03-05 29 views
0

注:AngularJSに固有のHow to always run some code when a promise is fulfilled in Angular.jsという重複した質問はありません。Javascript:約束が満たされた場合、同じ関数を呼び出す

私は、jQueryのdoneやAngularJSのfinallyのようなものを探しています。

私は、解決または拒否される約束を持っています。それが解決されたか否かにかかわらず、これと同じ機能を実行したいと思います。

var myPromise = new Promise(function(resolve, reject) { 
    resolve('Success!'); 
    if(something) { 
     resolve('ok'); 
    } else { 
     reject('not ok'); 
    } 
}); 
myPromise.then(function(data) { 
    var x = 1; 
    var y = 2; 
    console.log(data); 
}, function(data) { 
    var x = 1; 
    var y = 2; 
    console.log(data); 
}); 

上記のコードは動作します。問題は、同じ関数を2回コピーしていることです。

  • 代わりmyPromise.then(doWork, doWork);の、一度関数を記述し、そして...

    • :私は、私はこのような名前の関数かもしれない知っている:

      var myPromise = new Promise(function(resolve, reject) { ... }); 
      myPromise.then(doWork, doWork); 
      function doWork(data) { 
          var x = 1; 
          var y = 2; 
          console.log(data); 
      } 
      

      をしかしへの道があります場合、私は思ったんだけど名前付き関数の代わりに匿名関数を使用します。

  • 答えて

    5

    標準的なES6の約束事では、2番目の例のように名前付き関数を2回使用してください。標準的なES6にはfinallyはありません。

    Bluebird promise libraryには.finally()があり、これはうまく機能します。

    約束が拒否された場合は、文字通り気にしない場合、あなたはそれを常に満たしているように、このように満たすに拒絶反応を変えることができます:

    myPromise.catch(err => err).then(() => { 
        // put your code here 
    }); 
    

    あなたも.finally()を自分で作成することができます。

    if (!Promise.prototype.finally) { 
        Promise.prototype.finally = function(fn) { 
         return this.then(fn, fn); 
        }; 
    } 
    
    myPromise.finally(() => { 
        // your code here 
    }); 
    

    これを使用すると、返された約束(さらなる連鎖のため)は、fnが返す値を引き継ぎます。値を返すと、約束はその値をとります。それが約束を返すならば、親の約束はその新しい約束に従うでしょう。それが投げられるならば、新しい約束は拒否されるでしょう。

    .finally()の他の実装では、元の親の約束を常に追跡する約束を返して、.finally()コールバックの状態によって状態が影響を受けないようにします。その余分な機能をここでは求めていないので、やや複雑な実装を示していませんが、here in section 14.2のような実装を見ることができます。

    +0

    詳細<3 – evilReiko

    関連する問題