如何重组javascript函数以输出不同函数中的数据

时间:2018-10-09 15:45:04

标签: javascript jquery

我想知道你是否能帮助我。我有一些尝试重新构造的代码。现在是这样的:

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函数保持通用。

1 个答案:

答案 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