Deftjs承诺完成()不工作

时间:2013-12-16 23:29:46

标签: javascript extjs rally promise deftjs

我是承诺的新手,但我看了一些使用Deft.js的例子,我想知道为什么我的基本示例不起作用。

查看This site,我认为.done()功能应该有效,但我一直都会遇到错误。

这是我的代码:

onScopeChange: function(scope) {
    var promise = this.loadStories(scope).then({
        success: function(records) {
            console.log(records);
        },
        failure: function(error) {
            alert(error);
        }
    }).always(function() {
        // Do something whether call succeeded or failed
        console.log('this should always appear');
    }).done();
},

loadStories: function(scope) {
    var deferred = Ext.create('Deft.promise.Deferred');

    Ext.create('Rally.data.wsapi.Store', {
        autoLoad: true,
        model: 'UserStory',
        fetch: ['FormattedID', 'Name', 'ScheduleState','RevisionHistory'],
        filters: [scope.getQueryFilter()],
        listeners: {
            load: function(me, records, success) {
                this._onStoriesLoaded(deferred, records, success);
            },
            scope: this
        }
    });

    return deferred.promise;
},

_onStoriesLoaded: function(deferred, records, success) {
    console.log('stories loaded ...');
    if (success) {
        deferred.resolve(records);
    } else {
        deferred.reject("Error loading stories");
    }
}

这只是'Rally.data.wsapi.Store'导致异步回调的一个非常基本的例子。

我的问题只是.done()不起作用的原因 - 我一直收到错误说:

TypeError: Object [object Object] has no method 'done'

这意味着我的'promise'对象实际上并不是Deft Promise对象,对吗?

1 个答案:

答案 0 :(得分:2)

您确定使用的是Deft的最新版本吗?在您要链接的页面上,他说done()将被整合到Deft​​ v0.9中。

我已经针对Deft v0.9.1测试了以下代码,并且它的工作方式完全符合预期:

function defer() {
    var deferred = new Deft.promise.Deferred;

    deferred.reject('Done');

    return deferred.promise;
}

defer()
    .then({
        success: function(result) {
            console.log('Success: ' + result);
        }
        ,failure: function(result) {
            console.log('Failure: ' + result);
            a = b; // runtime error
        }
    })
    .always(function() {
        console.log('Always');
    })
    .done();

给我:

Failure: Done app.js:15
Always app.js:20
Uncaught ReferenceError: b is not defined 

我没有被告知done()未定义,如果没有done()调用,则吞下运行时错误。

(顺便说一句,感谢你引起我的注意,Deft已经发展了......错误的消息曾经让我有些悲伤!)