2010-08-24 3 views
0

Я новичок в moootools и я создаю класс шаблона, Это мой код -Как определить, когда запрос завершен в mootools?

var Template = new Class({ 
    Singleton : true, 
    template : '', 

    /* gets the component type template */ 
    get : function(componentType){ 
    var tplUrl = Core.getUrl('backend') + 'response/' + componentType + '/get_template.php', 
     that = this, 
     request = new Request({url: tplUrl, method : 'get',onSuccess : function(responseText){ 
      that.template = responseText; 
      return that; 
     }}).send(); 
    } 

}); 

То, что я хочу сделать это:

var tpl = new Template(); 
tpl.get('component').setTemplateData({name:'yosy'}); 

Проблема заключается в том, когда я называю это код:

var tpl = new Template(); 
console.log(tpl.get('component')); 

Я не получаю свой текущий объект Template, я получаю is undefined.
Как я могу сделать эту цепочку?

ответ

1

Вы делаете асинхронный вызов внутри функции get. Запрос может принимать 100 мс, 1с или 10 секунд, и к моменту завершения и возврата функции get запрос все равно будет отложен. Вместо этого вам нужно выполнить функцию обратного вызова до get и назвать это успешным.

get: function(componentType, successCallback) { 
    var request = new Request({ 
     .., 
     onSuccess: successCallback 
    }).send(); 
} 

Обратите внимание, что вы ничего не возвращаете из функции get. Одним из примеров способ вызвать это будет:

tpl.get('component', function(responseText) { alert(responseText); }); 
+0

, чтобы сделать его цепным, он также может превратиться в синхронный запрос, хотя он побеждает цель :) –

+0

Я перестала рекомендовать синхронный вариант :), но хорошими альтернативами была бы эта концепция [фьючерсов и обещаний] (http: /en.wikipedia.org/wiki/Futures_and_promises) и [очереди асинхронных методов] (http://www.dustindiaz.com/async-method-queues/) Дастина Диаса. – Anurag

-1

В вашей функции get отсутствует возвращаемое значение. Если вы хотите функции в цепи, вы должны возвращать сам объект:

get : function(componentType){ 
var tplUrl = Core.getUrl('backend') + 'response/' + componentType + '/get_template.php', 
    that = this, 
    request = new Request({url: tplUrl, method : 'get',onSuccess : function(responseText){ 
     that.template = responseText; 
     return that; 
    }}).send(); 

    return this; 
} 
+0

'обратный запрос,' –

+0

Не уверен, что при возврате текущего объекта или запрос будет на любую помощь здесь. 'get', вероятно, нуждается в обратном вызове, когда компонент загружается. – Anurag

+0

Но я хочу вернуть объект после загрузки запроса. – Yosi

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