2016-07-13 12 views
0

私はEmberのサービスで約束をする方法を理解しようとしています。私は実際には不可能と思われる理由を理解できませんは、チェーン拒否の以前の約束であると呼ばれるサービス機能を持っています。Ember約束サービス機能

もっと明確にするために、いくつかの異なる場所(サービス)に配置されるいくつかの約束をつなぎたいと思います。

return new Ember.RSVP.Promise(function(resolve, reject) { 
    resolve(); 
}).then(function() { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
    Ember.run.later(function() { 
     console.log('One'); 
     resolve(); 
    }, 3000); 
}); 
}).then(function() { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
    Ember.run.later(function() { 
     console.log('Two'); 
     resolve(); 
    }, 3000); 
}); 
}).then(function() { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
    Ember.run.later(function() { 
     console.log('Three'); 
     resolve(); 
    }, 3000); 
}); 
}).then((resolve) => { 
    console.log(resolve); 
}, (reject) => { 
    console.log(reject); 
}); 

をしかし、私は正確に同じ約束を含むサービス関数の呼び出しを有する第2約束機能を交換しようとすると、それは奇妙な行動を開始し、次のように単純化され、動作するコードは、見えます。

return new Ember.RSVP.Promise(function(resolve, reject) { 
    resolve(); 
}).then(this.get('demoService.serviceFunction')()).then(function() { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
     Ember.run.later(function() { 
      console.log('Two'); 
      resolve(); 
     }, 3000); 
    }); 
}).then(function() { 
    return new Ember.RSVP.Promise(function (resolve, reject) { 
     Ember.run.later(function() { 
      console.log('Three'); 
      resolve(); 
     }, 3000); 
    }); 
}).then((resolve) => { 
    console.log(resolve); 
}, (reject) => { 
    console.log(reject); 
}); 

2番目のケースでは、最初の約束が解決されたか拒否されたかにかかわらず、demoService.serviceFunctionが呼び出されます。関数がthis.get( 'demoService.serviceFunction')()またはhis.get( 'demoService')。serviceFunction()のように呼び出されるかどうかは関係ありません。

私は、問題を示すために責めを作成しました:https://ember-twiddle.com/67016c1cc440b0920e440d9fb1b18289は - コンソールは常に最初の約束が拒否された場合には、ケースすべきではないServiceFunctionCalledを出力しているようです。

私がここで間違っていることについて、誰かが私に洞察を与えてくれることを願っています。前もって感謝します!

答えて

1

thenに関数を渡す必要があります。しかし、あなたは関数を呼び出しました。

then(this.get('demoService.serviceFunction')).

または

then(() => this.get('demoService.serviceFunction')()).

:だから、以下のいずれかを実行することができます