Ember承诺服务功能

时间:2016-07-13 13:22:08

标签: ember.js

几个小时以来,我一直试图弄清楚如何在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,如果第一个承诺被拒绝,情况就不应该如此。

希望有人可以向我提供有关我在这里做错的见解。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您需要将功能传递给then。但你确实调用了一个函数。所以你可以做以下其中一个:

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

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