Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   последовательность функций (https://javascript.ru/forum/misc/19309-posledovatelnost-funkcijj.html)

stuff 01.08.2011 15:20

последовательность функций
 
добрый день. необходимо выполнить несколько функций последовательно. одна за другой.
при
f1();
f2();
f3();
...

выполняется только первая. если вставить между ними alert`ы - все работает. но для меня это не выход. подскажите, пожалуйста, решение

ваый 01.08.2011 15:38

что внутри?

stuff 01.08.2011 15:50

var Billing = Class.create();
Billing.prototype = {
    initialize: function(form, addressUrl, saveUrl){
        this.form = form;
        if ($(this.form)) {
            $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
        }
        this.addressUrl = addressUrl;
        this.saveUrl = saveUrl;
        this.onAddressLoad = this.fillForm.bindAsEventListener(this);
        this.onSave = this.nextStep.bindAsEventListener(this);
        this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
    },

    setAddress: function(addressId){
        if (addressId) {
            request = new Ajax.Request(
                this.addressUrl+addressId,
                {method:'get', onSuccess: this.onAddressLoad, onFailure: checkout.ajaxFailure.bind(checkout)}
            );
        }
        else {
            this.fillForm(false);
        }
    },

    newAddress: function(isNew){
        if (isNew) {
            this.resetSelectedAddress();
            Element.show('billing-new-address-form');
        } else {
            Element.hide('billing-new-address-form');
        }
    },

    resetSelectedAddress: function(){
        var selectElement = $('billing-address-select')
        if (selectElement) {
            selectElement.value='';
        }
    },

    fillForm: function(transport){
        var elementValues = {};
        if (transport && transport.responseText){
            try{
                elementValues = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                elementValues = {};
            }
        }
        else{
            this.resetSelectedAddress();
        }
        arrElements = Form.getElements(this.form);
        for (var elemIndex in arrElements) {
            if (arrElements[elemIndex].id) {
                var fieldName = arrElements[elemIndex].id.replace(/^billing:/, '');
                arrElements[elemIndex].value = elementValues[fieldName] ? elementValues[fieldName] : '';
                if (fieldName == 'country_id' && billingForm){
                    billingForm.elementChildLoad(arrElements[elemIndex]);
                }
            }
        }
    },

    setUseForShipping: function(flag) {
        $('shipping:same_as_billing').checked = flag;
    },

    save: function(){
        if (checkout.loadWaiting!=false) return;

        var validator = new Validation(this.form);
        if (validator.validate()) {
            checkout.setLoadWaiting('billing');

            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method: 'post',
                    onComplete: this.onComplete,
                    onSuccess: this.onSave,
                    onFailure: checkout.ajaxFailure.bind(checkout),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },

    resetLoadWaiting: function(transport){
        checkout.setLoadWaiting(false);
    },

    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }

        if (response.error){
            if ((typeof response.message) == 'string') {
                //alert(response.message);
            } else {
                if (window.billingRegionUpdater) {
                    billingRegionUpdater.update();
                }
                //alert(response.message.join("\n"));
            }

            return false;
        }

        checkout.setStepResponse(response);
        payment.initWhatIsCvvListeners();
    }
}

в данном случае вызывается billing.save()
остальные классы с аналогичными функциями

B@rmaley.e><e 01.08.2011 15:54

AJAX на то и AJAX, что он асинхронный. Если Вам нужно дождаться выполнения предыдущего запроса, используйте либо синхронный запрос, либо посылайте следующий после завершения предыдущего (т.е. в callback'е)

ваый 01.08.2011 15:56

Цитата:

Сообщение от stuff
если вставить между ними alert`ы - все работает

Возможно, дело задержке, обусловленной асинхронным характером каких-то запросов.

stuff 01.08.2011 16:01

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 116644)
AJAX на то и AJAX, что он асинхронный. Если Вам нужно дождаться выполнения предыдущего запроса, используйте либо синхронный запрос, либо посылайте следующий после завершения предыдущего (т.е. в callback'е)

ума не приложу как вызвать через коллбеки 5 функций
Цитата:

Сообщение от ваый (Сообщение 116645)
Возможно, дело задержке, обусловленной асинхронным характером каких-то запросов.

видимо, так и есть. а не подскажите, как это лечится?

ваый 01.08.2011 16:36

Как лечится? Выше ответили, как, в #4.

stuff 01.08.2011 16:44

если бы я был гуру js то, очевидно, въехал бы о чем речь. поскольку это не так - прошу помощи

розовый слоник 01.08.2011 16:52

прикольно)
или код писало 2а человека или один но в разное время с разным настроением:)
по окончанию выполнения запроса приходит ответ это и есть момент когда вы можете выполнить свои 5ть функций. не поленитесь по почитай те про ajax) больше прочтете быстрее станете гуру.

З.Ы.
хорошая книга если вы даже не представляете что такое ajax - Изучаем Ajax Бретт Маклафлин
я начинал знакомство именно с нее

ваый 01.08.2011 17:02

Что находится в методе this.onSave, который выполняется в качестве колобка?


Часовой пояс GMT +3, время: 05:55.