2013-12-16 2 views
3

Я новичок в обещаниях, но я рассмотрел некоторые примеры использования Deft.js, и мне интересно, почему мой основной пример не работает.Deftjs обещание сделано() не работает

Глядя на 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, верно?

ответ

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 развился ... Отвращение ошибок было чем-то, что когда-то давало мне большие горести!)

Смежные вопросы