jQuery asyn c ajax звонки - PullRequest
       1

jQuery asyn c ajax звонки

0 голосов
/ 13 марта 2020

У меня есть следующий код со списком, и для каждого элемента в этом списке выполните ajax вызов.

util.testMethod = function(list) {

            var map = new Map();

            list.forEach(function(data) {
                $.ajax({
                    url: 'https://......',
                    type: 'GET',
                    data: // data needed here
                    success: function(data) {
                        // do something
                    },
                    error: function(jqxhr, settings, exception) {
                        // dos omething
                    }
                });
            });


            return map;
        };

Поскольку я делаю число асин c ajax вызовы, давайте предположим, что один из них занимает столько времени, чтобы выполнить. Есть ли вероятность, что этот testMethod вернется до этого ajax вызова fini sh?

1 Ответ

2 голосов
/ 13 марта 2020

Определенно. Вызов ajax является асинхронным, поэтому код будет продолжать выполняться без ожидания функций обратного вызова. как синхронный вызов (подробнее здесь )

(рекомендуется) Сделайте ваши testMethod функции асинхронными c (подробнее здесь )

Но (опция 1º) :

Установка свойства asyn c на false устарела и в процессе удаления ( ссылка ). Многие браузеры, включая Firefox и Chrome, уже начали печатать предупреждение в консоли, если вы используете это:

И следует примеру для опции 2º (подробнее о * 1049) * обещания здесь и Promise.All здесь ) :

async function makeAjaxCall()  {
    return new Promise((resolve) => {
        setTimeout(() => {
            // Just to make the makeAjaxCall 1 second slower;
            $.ajax({
                url: 'http://www.mocky.io/v2/5e6ac7d32d0000db0c5fa686',
                type: 'GET',
                data: {},
                success: function(data) {
                    resolve(data);
                },
                error: function(jqxhr, settings, exception) {

                     resolve({ error: 'OMG an ERROR!'});
                    // dos omething
                }
            })
        }, 1000);
    });      
};

async function asynCall() {
  for(let i=0; i<10; i++) {
      // You can see in here that will wait 1 second before is going to the next ajax call
      const result = await makeAjaxCall();
      console.log(result);
  }
}

// You can run all your calls in paralel by using the Promise.All like this
async function promiseAll() {
  const ajaxCalls = [];
  for(let i=0; i<10; i++) {
      ajaxCalls.push(makeAjaxCall());
  }
  
  //for this case, the calls will be made in parallel, which measn will take slight more than 1 second 
  Promise.all(ajaxCalls).then(function(values) {
    // will print the array of values which contains the values of each ajax call
    console.log(values);
  });
}

asynCall();
promiseAll();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...