Замедлите цикл for с помощью await и setTimerout - PullRequest
0 голосов
/ 18 февраля 2019

Я много раз просматривал ответы, но мне нужна помощь.Я пытаюсь эмулировать Комбинацию асинхронной функции + await + setTimeout

while (goOn) {
  // other code
  var [parents] = await Promise.all([
                    listFiles(nextPageToken).then(requestParents),
                    timeout(5000)
                  ]);
   // other code
}

. Причина в том, что я зацикливаю значения в сетке и отправляю их в URL NIH.Я могу отправить только 10 запросов в секунду.Поэтому моя первая попытка подождать, чтобы использовать await и async, чтобы не отправлять запрос, пока не будет сделано.Ну, это тоже слишком быстро.Таким образом, я хотел бы поместить 1/10-ой секунды времени сна между каждым запросом.И я ничего не могу заставить работать.

мой код

async function myFunction5() {
  var datainformation = $('#grid').jqxGrid('getdatainformation');
  var rowscount = datainformation.rowscount;
  try {
    for (let i = 0; i < rowscount; i++) {
      var data = $('#grid').jqxGrid('getrowdata', i); //
      let currentTerm = "(" + Strings.orEmpty(data['First Name']) + " " +
        Strings.orEmpty(data['Middle Initial']) + " " + Strings.orEmpty(data['Last Name']) + " " +
        Strings.orEmpty(data['Suffix']) + "[Author - Full]) AND " + Strings.orEmpty(data['Affiliations']) +
        "[Affiliation]";

      let terms = encodeURI(currentTerm);          
      const url =
        "/path/to/resource/" +
        terms;         

      var [pmids_List] = await Promise.all([
        getJson(url, i),
        timeout(100)
      ]);
    }
    //alert('all done');
  } catch (err) {
    alert(i + " " + data['Last Name']);
    console.log('done with some errors');
  }
}

и он вызывает

function getJson(url, i) {
  var timestamp = new Date().toJSON();
  console.log(timestamp + ' getJSON')
  return new Promise(function (resolve, reject) {
    $.ajax({
      url: url,
      dataType: 'json',
      crossDomain: true,
      success: function (data) {
        var pmids = data.esearchresult.idlist;
        var pmidlist = pmids.join();
        pmid_List.push(pmidlist);
        console.log('success', i)
      },
      error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr.status);
        console.log(thrownError);
      },
      complete: function (a, b) {
        resolve(a);
        console.log('complete', i);
      }
    });
  });  
}

Я знаю, что мой Promise.all неверен, ноЯ не могу понять, что правильно.Ваша помощь приветствуется.И если у вас есть идея получше, я весь в ушах.Также мне нужно знать, как определить, когда цикл полностью завершен, чтобы я мог перейти к следующему шагу

...