我想知道你是否能帮助我。我有一些尝试重新构造的代码。现在是这样的:
function myfunction(ref) {
getReport(ref, "queue", "hour", "2018-09-03", "2018-10-04", "pageviews", "page").done(function(r1) {
getReport(r1.reportID, "get").done(r2=>reportHandler(r1.reportID, r2, 0))
});
}
function reportHandler(id, r2, retries){
if(retries >= 3){
console.log("Retried 3 times - stopping")
return
}
if (r2.error == "report_not_ready") {
console.log("Not ready");
setTimeout(function() {
getReport(id, "get").done(r2=>reportHandler(id, r2, retries + 1))
}, 2000);
}
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,
});
}
我还无法弄清楚如何处理数据,这是我希望能够执行的功能。
目前,我唯一能做的就是在报表处理程序函数中返回数据。
我希望能够从myfunction函数中的API返回数据,然后再对其进行进一步处理,然后使我的reporthander和getreport函数保持通用。
答案 0 :(得分:1)
我相信您的问题出在这里:
getReport(r1.reportID, "get").done(r2=>reportHandler(r1.reportID, r2, 0))
$.getJSON()
起到了应有的作用,.done()
的功能与.then()
相同。这两个都接受一个函数作为参数,但是传递它的方式是不正确的语法。通过向函数传递参数而不只是其名称,就可以告诉JavaScript运行该函数并使用其结果-这不是您想要的。对于您而言,最简单的解决方法是:
getReport(r1.reportId, "get").done((r2) => { reportHandler(r1.reportId, r2, 0); });
或者,如果您能够使用新的async / await语法,则可以使其更简单:
const r2 = await getReport(r1.reportId, "get");
const handler = await reportHandler(r1.reportId, r2, 0);
// and so on
这有意义吗?如果还有其他您不了解的地方,请告诉我们。
编辑:好的,因此,根据对此答案的评论,正在运行的代码的正确结构为:
function myfunction(ref) {
getReport(ref, "queue", "hour", "2018-09-03", "2018-10-04", "pageviews", "page").done(function(r1) {
getReport(r1.reportId, "get").done((r2) => {
reportHandler(r1.reportId, r2, 0);
});
});
}
那么,我能想到的唯一答案是,getReport()
中的第一个myFunction()
调用未返回正文中带有reportId
的对象。运行此代码时是否遇到未捕获的错误?
编辑2:根据注释,由于大写错误而未正确引用属性。响应返回r1.reportId
时,代码正在调用r1.reportID
。