Сделать ajax вызов зависимым от другого ajax вызова - PullRequest
0 голосов
/ 06 апреля 2020

Я бы не хотел вкладывать кучу ajax звонков внутри события 'success' друг друга. Мне было интересно, если кто-то может направить меня в правильном направлении, как сделать что-то подобное? Где один ajax вызов зависит от возвращаемого значения другого?

Функция getLoginAccess () будет использоваться во многих других методах аналогичным образом.

Если первый сбой, я бы хотел, чтобы он возвратил «нулевое» значение, которое я могу принять во внимание перед выполнением второго вызова ajax. Ниже я демонстрирую пример того, что я пытаюсь сделать.

Метод getLoginAccess возвращает словарь данных, необходимый для выполнения второго метода createItem . Поэтому, только если getLoginAccess вернет действительные данные, createItem продолжит вызывать фактический ajax вызов.

Спасибо

function getLoginAccess() {    
    $.ajax({
        url: '.../api/v1/auth/access_token',
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept': 'application/json',
            'Connection': 'keep-alive'
        },
        data: {
            grant_type: 'client_credentials',
            username: 'johnDoe',
            password: '******'
        },
        success: function (data) {
            console.log(JSON.stringify(data));
            return data;
        },
        error: function (data) {
            console.log(data);
            return null;
        }
    })
}

function createItem() {

    var login = getLoginAccess();
    if (login == null) {
     return false;
    }

    $.ajax({
        url: '.../api/v1',
        method: 'POST',
        headers = {
            'Accept': 'application/json',
            'Content-Type': 'application/x-www-form-urlencoded',
            'access': `${login.access_token}`
        };
        data: {},
        success: function (data) {
            console.log(JSON.stringify(data));
        },
        error: function (data) {
            console.log(data);
        }
    })
}

window.onload = function(){
    createItem();
};

1 Ответ

1 голос
/ 06 апреля 2020

Если вы хотите провести рефакторинг той части, где проверен вход в систему, мы можем создать промежуточную функцию .. что-то вроде этого:

Ваша функция входа здесь

function getLoginAccess(){
   // Return login data or null
}

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

function intermediateFunction(functionName,login){
    if(login){
        window[functionName]();
    }
}

Вот другие созданные вами функции.

function createItem() {
   // Do something
}

function listItem() {
   // Do something
}

Здесь вместо вызова функции createItem () вы вызываете посредника

  window.onload = function(){
     intermediateFunction(getLoginAccess(), "createItem");
  };

Таким образом, в основном вы всегда вызываете промежуточную функцию, которая проверяет логин перед вызовом конкретной функции. Я полагаю, что это то, как я бы рефакторинг:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...