3

私はプロミスは初めてですが、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'

これは、私の「約束」オブジェクトが実際には Deft Promise オブジェクトではないことを意味しますよね?

4

1 に答える 1

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 が進化したことを知らせてくれてありがとう...エラーのミュートは、かつて私にいくつかの大きな悲しみを与えたものでした!)

于 2013-12-17T08:33:37.377 に答える