0

我正在使用一个 API,该 API 为我提供了每个请求的数据限制(此处为 25)。因此,我必须用 fetch 递归地做出承诺。然而,虽然我的大部分逻辑都有效,但当我尝试从函数返回时,它将返回一个空数组。下图会更清楚。

const url = (conf_name) => {
  return (
    "https://api.elsevier.com/content/search/scopus?view=COMPLETE&cursor=*&query=CONFNAME(" +
    conf_name +
    ")%20AND%20DOCTYPE(cp)%20AND%20SRCTYPE(p)&field=dc:creator,dc:title,dc:description,affilname,affiliation-city,affiliation-country,authkeywords,prism:doi,prism:doi,prism:coverDate"
  );
};

const savePapers = (json, conf_name) => {
  let temp = new Array();
  for (let i = 0; i < json["search-results"]["entry"].length; i++) {
    temp[i] = {
      title: json["search-results"]["entry"][i]["dc:title"],
      author: json["search-results"]["entry"][i]["dc:creator"],
      publication_date: json["search-results"]["entry"][i]["prism:coverDate"],
      doi: json["search-results"]["entry"][i]["prism:doi"],
      abstract: json["search-results"]["entry"][i]["dc:description"],
      author_keywords: json["search-results"]["entry"][i]["authkeywords"],
      proceeding: conf_name,
    };
  }
  return temp;
};

async function getPapers(final, url, conf_name) {
  let total_amount_of_papers;
  let next;
  let position = 2;

  try {
    let response = await fetch(url, options);
    let json = await response.json();

    total_amount_of_papers = json["search-results"]["opensearch:totalResults"];

    if (json["search-results"]["link"][position]["@ref"] == "prev")
      next = json["search-results"]["link"][position + 1]["@href"];
    next = json["search-results"]["link"][position]["@href"];

    final = final.concat(savePapers(json, conf_name));
    if (final.length === 50) {
        console.log("hey",final.length);
        return final;
    }
    await getPapers(final, next, conf_name);
  } catch (error) {
    console.log(error);
  }
}

const createNewConf = async (conferences) => {
  let final = new Array();
  try {
    var temp = new Conference({
      acronym: conferences.acronym,
      name: conferences.fullname,
      area: conferences.area,
      subarea: conferences.subarea,
      location: conferences.location,
      url: conferences.url,
      description: conferences.description,
      papers: await getPapers(final, url(conferences.acronym),conferences.acronym),
    });
    console.log(temp.papers.length);
  } catch (error) {
    console.log(error);
  }
  return temp;
};

describe("Saving records", function () {
  it("Saved records to the database", async function (done) {
    var conferences = [];
    try {
      for (var i = 0; i <= 1; i++) {
        conferences[i] = await createNewConf(json_conferences[i]);
        conferences[i].save().then(function () {
          assert(conferences[i].isNew === True);
          done();
        });
      }
      mongoose.connection.close();
    } catch (error) {
      console.log(error);
    }
  });
});

您可以在下面看到传递 if 以停止获取更多内容后我的最终数组的长度。第二个号码是我在初次通话中收到的号码

安慰

也许任何人都知道返回期间发生的未定义行为。

非常感谢您的帮助。

4

0 回答 0