Я так близок к тому, что это работает. Этот код запрашивает 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,
});
}
Проблема с этим кодом заключается в том, что иногда отчет не готов, когда мы пытаемся его получить, поэтому нам нужно немного повторить попытку. Код, который у меня есть, в настоящий момент снова перезапускает весь отчет, если он возвращается не готов, включая создание нового идентификатора отчета.
То, что он предназначен, - это просто повторить исходный идентификатор отчета.
Может ли кто-нибудь помочь мне понять, как это сделать, пожалуйста?
После кода вызывает 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))
});
}
Из кода кажется, что вам нужно только повторно получить результат для 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,
});
}
Таким образом, ваша повторная попытка охватывает только второй поиск.