Опрос, Ajax и статус обратного вызова - PullRequest
1 голос
/ 22 января 2020

Я хочу непрерывно опрашивать, используя jQuery и AJAX для URL, пока не получу ответ с кодом состояния 200. URL указывает на REST API, который предоставляет файл. В идеале я получаю другие коды состояния, по которым я просто перезвоню URL, и только когда вернется 200, я оставлю рекурсию и сделаю что-то еще.

Для рекурсии мне нужно сохранить var jsonobj.

Я с треском проваливаюсь с получением ответа от вызова ajax. Я пытался повторить это . Ранее я пытался обработать jsonobj в statusCode, но он не проходил.

var jsonobj = 9189829182 // (job-id) returned from an earlier call which is not depicted here

function doPoll(jsonobj) {
  function pollQuery(p_data, state) {
    jQuery.ajax({
      headers: {
        "access-token": "67e9489669217"
      },
      type: 'GET',
      url: 'https://someurl/classifier/' + jsonobj["id"],
      crossDomain: true,
      statusCode: {
        200: function(p_data, state) {
          console.log("data available");
        },
        204: function(p_data, state) {
          console.log("processing");
        }, // this shows on console, but how do we get the state out of here?
        404: function(p_data, state) {
          console.log("resource not found / not available");
        }
      }
    })
  }

  console.log("jsonobj :" + jsonobj);

  pollQuery(function(response) {
    console.log("response :" + response); // not working
    console.log("state :" + state); // not working
  });
}

1 Ответ

2 голосов
/ 22 января 2020

Чтобы исправить это, вам нужно исправить аргумент обратного вызова, так как вы переопределяете его в каждой из функций-обработчиков statusCode. Кроме того, вы можете упростить логи c, получив код состояния из объекта jqXHR, переданного в success, вместо необходимости писать код для каждого возможного кода состояния. Это также сделает рекурсию более простой. Попробуйте это:

function doPoll(obj) {
  function pollQuery(callback) {
    jQuery.ajax({
      headers: {
        "access-token": "67e9489669217"
      },
      type: 'GET',
      url: 'https://someurl/classifier/' + obj["id"],
      crossDomain: true,
      success: function(data, status, xhr) {
        if (xhr.status !== 200) {
          setTimeout(function() {
            pollQuery(callback); // recurse after 10 second delay
          }, 10000);
          
          // if required you can handle the messages shown for 204 and 404 states here...          
        } else {
          callback && callback(data); // 200 received, execute callback function
        }
      }
    })
  }

  pollQuery(function(response) {
    console.log("response :" + response);
  });
}

Однако Я настоятельно рекомендую вам не следовать шаблону AJAX опроса, поскольку он не масштабируется и, в долгосрочной перспективе, вызывает больше проблем, чем решает. Я настоятельно рекомендую вам следовать шаблону наблюдателя вместо этого, используя Websockets. Доступно множество ресурсов, показывающих, как это сделать при поиске.

...