循环执行100+次getJSON调用,并在完全完成后调用另一个函数

时间:2019-02-17 18:12:43

标签: javascript jquery

我需要读取一个网格并获取该数据并调用$ getJSON url。网格可能有100多行数据。 getJSON返回我添加到数组中的逗号分隔值的列表。循环完成后,我将数组处理为重复。我需要在另一个过程中使用重复项。我知道我无法确定返回数据的顺序,但我需要知道所有调用均已完成。

            for (let i = 0; i < rowscount; i++){
              $.getJSON(
      "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmode=json&retmax=500&term=" +
      terms,
      function (data) {
        var pmids = data.esearchresult.idlist;
        var pmidlist = pmids.join();
        pmid_List.push(pmidlist);
        if (i == rowscount - 1) {
          // call the related function
        }            
      });
       }

我不知道如何确定该过程已完成。有时会很早就调用相关功能。

3 个答案:

答案 0 :(得分:0)

好吧,如果我们跟踪完成了多少代码,那么我们可以在最后一个代码完成后触发代码。

Office.context.ui.closeContainer()

答案 1 :(得分:0)

我会使用fetch和Promise.all

const link = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmode=json&retmax=500&term=";

Promise.all(Array.from({
  length: 3
}, () => fetch(link + 'foo').then(e => e.json()))).then(e => {
   //called when all requests are done      
   console.log(e);
})

答案 2 :(得分:0)

尝试一下

function getJson(url, i) {
    return $.getJSON(url, function (data) {
        //var pmids = data.esearchresult.idlist;
        //var pmidlist = pmids.join();
        //pmid_List.push(pmidlist);   
        console.log('completed', i)
        return data;
    });
}

function run() {
    let promises = []

    for (let i = 0; i < rowscount; i++) {
        const terms = 'foot';
        const url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&retmode=json&retmax=500&term=" + terms;
        promises.push(getJson(url, i));
    }

    return promises;
}

Promise.all(run()).then(() => console.log('All are completed'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>