Как я могу остановить вызов метода объекта до завершения ajax - PullRequest
2 голосов
/ 21 июля 2011

У меня есть следующий объект java-скрипта

function eventTypeObj() {

allEventTypes = [];

// When the object is created go and get all the event types that can be included in journey or clusters.
$.ajax({
        url: "/ATOMWebService.svc/GetDisplayEventTypes",
        dataType: "json",
        success: function(result) {
            allEventTypes = eval("(" + result.d + ")");
        }
    });


// Returns a list of all the event type IDS.
this.getEventTypeIds = function() {
    var eventTypeIDs = [];
    for (var i = 0; i < allEventTypes.length; i++) {
        eventTypeIDs.push(allEventTypes[i].Id);
    }
    return eventTypeIDs;
};
}

Мне было интересно, есть ли способ остановить кого-нибудь, вызывающего eventTypeObj.getEventTypeIds (); до того, как вызов ajax в конструкторе завершился успешно, и в массиве allEventTypes нет данных?

Ответы [ 4 ]

2 голосов
/ 21 июля 2011

Что-то вроде этого было бы намного лучше (я не гарантирую, что это на 100% работает, но концепция обоснована):

function eventTypeObj() {
    this.allEventTypes = [];
    this.hasLoadedEventTypes = false;

    var loadEventTypes = function(cb) {
        $.ajax({
            url: "/ATOMWebService.svc/GetDisplayEventTypes",
            dataType: "json",
            success: function(result) {
                this.allEventTypes = eval("(" + result.d + ")");
                this.hasLoadedEventTypes = true;
                cb();
            }
        });
    };


    this.getEventTypeIds = function(updateEventTypes, callback) {
        var _getEventTypeIds = function() {
            var eventTypeIDs = [];
            for (var i = 0; i < this.allEventTypes.length; i++) {
                eventTypeIDs.push(this.allEventTypes[i].Id);
            }    
            return eventTypeIDs;
        };


        if (!this.hasLoadedEventTypes || updateEventTypes) {
            loadEventTypes(function(){ callback(_getEventTypeIds()); });
        }
        else callback(_getEventTypeIds());
    };
}

Пример использования:

var eto = new eventTypeObj();

eto.getEventTypeIds(false, function(eventTypeIdArray) {
   // do stuff with the id array 
});


/*
    somewhere later on you want to get an updated eventTypeId array
    in case the event types have changed.
*/
eto.getEventTypeIds(true, function(eventTypeIdArray) {
    // do stuff with the updated ids
});
1 голос
/ 21 июля 2011
var allowCall = false;
function eventTypeObj() {

allEventTypes = [];

// When the object is created go and get all the event types that can be included in journey or clusters.
$.ajax({
        url: "/ATOMWebService.svc/GetDisplayEventTypes",
        dataType: "json",
        success: function(result) {
            allEventTypes = eval("(" + result.d + ")");
            allowCall = true;
        }
    });


// Returns a list of all the event type IDS.
this.getEventTypeIds = function() {
    if(!allowCall) return;  // or pop up a message
    var eventTypeIDs = [];
    for (var i = 0; i < allEventTypes.length; i++) {
        eventTypeIDs.push(allEventTypes[i].Id);
    }
    return eventTypeIDs;
};
}

Или просто проверьте, является ли allEventTypes пустым или нет.

1 голос
/ 21 июля 2011

Невозможно помешать кому-либо позвонить слишком рано.Что бы вы хотели, чтобы произошло, если бы они вызвали его слишком рано?

Похоже, ваш код в настоящее время возвращает пустой массив, если allEventTypes еще не заполнен. Вы можете решить, является ли пустой массивправильный результат, или если вы должны сгенерировать исключение, когда оно вызывается слишком рано, чтобы абоненту было абсолютно ясно, что данные еще не доступны.

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

Если вы не 'Если вы хотите, чтобы ответственность за синхронизацию была на звонящих, вы не можете предложить синхронный способ получения этой информации.Вместо этого вы бы предложили только механизм обратного вызова для получения данных.Если данные готовы, обратный вызов будет вызван немедленно.Если данные не готовы, обратный вызов вызывается после завершения функции ajax.В любом случае вызывающая сторона должна будет обрабатывать данные только в обратном вызове, и getEventTypeIds не будет обычным вызовом для получения данных, как сейчас, а скорее вызовом для регистрации обратного вызова, который будет вызываться с данными, когда былготовы.Это избавило бы вызывающего от необходимости знать детали реализации, когда данные были готовы, но заставило бы их использовать асинхронный характер механизма обратного вызова.

this.getEventTypeIds = function(callback) {
    if (allEventTypes.length > 0) {
        // data is ready call the callback with the data now
    } else {
        // store the callback to be called later from the success handler
    }
}
0 голосов
/ 21 июля 2011

Вы можете проверить, пустой ли массив eventType, верно?

if(allEventTypes.length == 0)
{
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...