Повторите функцию обещание, если мы получим определенный результат

1

Я так близок к тому, что это работает. Этот код запрашивает API для возврата идентификатора reportID, а затем запрашивает его снова с идентификатором reportID для получения данных.

function myfunction(ref) {
  getReport(ref, "queue", "hour", "2018-10-03", "2018-10-04", "pageviews", "page").done(function(r1) {
    getReport(r1.reportID, "get").done(function(r2) {
      if (r2.error == "report_not_ready") {
        console.log("Not ready");
        setTimeout(function() {
          myfunction(ref)
        }, 1000);
      }
      console.log(r2);
    })
  });
}


function getReport(ref, type, granularity, from, to, metric, element) {
  return $.getJSON("report.php", {
    ref: ref,
    type: type,
    granularity: granularity,
    from: from,
    to: to,
    metric: metric,
    element: element,
  });
}

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

То, что он предназначен, - это просто повторить исходный идентификатор отчета.

Может ли кто-нибудь помочь мне понять, как это сделать, пожалуйста?

  • 1
    Не будет ли это зависеть от поведения вашего серверного скрипта? Кроме того, если отчет не готов, когда вы к нему обращаетесь, почему бы просто не подождать, пока ваш XHR не будет готов? В любом случае, в этом и заключается смысл иметь асинхронные запросы, чтобы они могли ждать ответа от сервера, а ваши пользователи не должны этого делать. Если я не понял ваш вопрос, что вполне может быть так.
  • 0
    @KamilJarosz Возможно, есть лучший способ сделать это, но мне сказали использовать обещания, чтобы я мог поместить данные из вызова в другую функцию, когда она будет готова. Стремится узнать, есть ли у вас лучший способ.
Показать ещё 3 комментария
Теги:

2 ответа

1
Лучший ответ

После кода вызывает api 3 раза, а затем выходит,

function reportHandler(id, r2, retries){
    if(retries >= 3){
        console.log("tried 3 times")
        return
    }
    if (r2.error == "report_not_ready") {
        console.log("Not ready");
        setTimeout(function() {
          getReport(id, "get").done(r2=>reportHandler(id, r2, retries + 1))
        }, 1000);
      }
      console.log(r2);
}

function myfunction(ref) {
  getReport(ref, "queue", "hour", "2018-10-03", "2018-10-04", "pageviews", "page").done(function(r1) {
    getReport(r1.reportID, "get").done(r2=>reportHandler(r1.reportID, r2, 0))
  });
}
  • 0
    Этот код работает отлично, единственная проблема заключается в том, что он не выходит из кода после трех неудачных попыток, но он правильно говорит «попробовал 3 раза»
  • 0
    @ Джимми, да, он должен вернуться в блок if, обновил код.
1

Из кода кажется, что вам нужно только повторно получить результат для r2, в этом случае я предлагаю вам извлечь его по собственному методу следующим образом:

function myfunction(ref) {
    getReport(ref, "queue", "hour", "2018-10-03", "2018-10-04", "pageviews", "page").done(function (r1) {
        getReportFromId(r1.reportID);
    });
}

function getReportFromId(reportId) {
    getReport(reportId, "get").done(function (r2) {
        if (r2.error == "report_not_ready") {
            console.log("Not ready");
            setTimeout(function () {
                getReportFromId(reportId)
            }, 1000);
        }
        console.log(r2);
    })
}

function getReport(ref, type, granularity, from, to, metric, element) {
    return $.getJSON("report.php", {
      ref: ref,
      type: type,
      granularity: granularity,
      from: from,
      to: to,
      metric: metric,
      element: element,
    });
}

Таким образом, ваша повторная попытка охватывает только второй поиск.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню