2013-04-07 1 views
0

Я думаю, что добавил слой сложности. Вот что я получил:Как использовать обещания jQuery, чтобы функции не были вложены

;(function($, window, undefined) { 
    function download() { 
     var local = {}; 
     local.data = {}; 
     local.data.method = 'getMyData'; 
     local.dataType = 'json'; 
     local.Promise = $.ajax('myComponent.cfc', local); 
     local.Promise.done(PromiseDone); 
     local.Promise.fail(PromiseFail); 
    } 

    function PromiseDone(result) {}; 
    function PromiseFail(myEvent) {}; 
})(jQuery, window); 

То, что я хотел бы сделать что-то вроде этого:

;(function($, window, undefined) { 
    var Variables = {}; 
    Variables.Promise = $.Deferred(); 

    function download() { 
     var local = {}; 
     local.data = {}; 
     local.data.method = 'getMyData'; 
     local.dataType = 'json'; 
     Variables.Promise = $.ajax('myComponent.cfc', local); 
    } 

    Variables.Promise.done(function(result) { 
    }); 
    Variables.Promise.fail(function(myEvent) { 
    }); 
})(jQuery, window); 

Моя цель состоит в том, чтобы сгладить JavaScript, чтобы мои функции не являются вложенными.

Вопрос: Будет ли моя идея работать, или deferred требует resolve для рассмотрения done?

ответ

2

Вы действительно добавили ненужную сложность. $.ajax уже возвращает обещание, поэтому нет причин для создания другого:

;(function($, window, undefined) { 
    function download() { 
     return $.ajax({ 
      data : {method:'getMyData'}, 
      dataType: 'json' 
     }); 
    } 

    var ajaxCall = download(); 

    ajaxCall.done(function(result) { 
      // do something with result 
    }); 

    ajaxCall.fail(function() { 
     // failed 
    }); 
})(jQuery, window); 
+0

OMG. return $ .ajax(). Brilliant! –

+0

Есть ли способ сказать, что без привязки .fail к .done? –

+0

@Phillip - немного изменил ответ! – adeneo