我一直在寻找答案,但是我需要一些帮助。我正在尝试模拟Combination of async function + await + setTimeout
while (goOn) {
// other code
var [parents] = await Promise.all([
listFiles(nextPageToken).then(requestParents),
timeout(5000)
]);
// other code
}
原因是我正在循环网格中的值并将其发送到NIH url。我只能在一秒钟内发送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是错误的,但是我不知道是正确的。感谢您的帮助。而且,如果您有更好的主意-我很高兴。另外我还需要知道如何确定循环何时完全完成,以便继续下一步