几个小时以来,我一直试图弄清楚如何在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);
});
但是当我尝试用对包含完全相同的promise的服务函数的调用来替换第二个promise函数时,它开始变得很奇怪。
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);
});
在第二种情况下,无论第一个承诺是解决还是拒绝,都会调用demoService.serviceFunction。函数是否像this.get('demoService.serviceFunction')()或his.get('demoService')。serviceFunction()一样被调用并不重要。
我已经创建了一个演示问题的方法:https://ember-twiddle.com/67016c1cc440b0920e440d9fb1b18289 - 控制台似乎总是输出ServiceFunctionCalled,如果第一个承诺被拒绝,情况就不应该如此。
希望有人可以向我提供有关我在这里做错的见解。提前谢谢!
答案 0 :(得分:1)
您需要将功能传递给then
。但你确实调用了一个函数。所以你可以做以下其中一个:
then(this.get('demoService.serviceFunction')).
或
then(() => this.get('demoService.serviceFunction')()).