JavaScript异步循环
我想知道是否有更好的方法在JavaScript中执行异步循环?我一直在使用下面的递归方法,但我觉得可能有更干净的方法。如有任何链接/建议,将不胜感激。谢谢JavaScript异步循环,javascript,asynchronous,recursion,Javascript,Asynchronous,Recursion,我想知道是否有更好的方法在JavaScript中执行异步循环?我一直在使用下面的递归方法,但我觉得可能有更干净的方法。如有任何链接/建议,将不胜感激。谢谢 var titles = ['Test 1', 'Test 2', 'Test 3']; var i = 0; addColumns(); function addColumns () { if (i < titles.length) { var data = { '__metada
var titles = ['Test 1', 'Test 2', 'Test 3'];
var i = 0;
addColumns();
function addColumns () {
if (i < titles.length) {
var data = {
'__metadata': { 'type': 'SP.FieldText' },
'FieldTypeKind': 3,
'Title': titles[i],
'MaxLength': '22'
};
postToSP.createColumns(baseURL, listName, data)
.then(function () {
i++;
addColumns();
})
.catch(function(e){
console.log('Error: ' + e);
})
} else {
return;
};
};
var titles=[‘测试1’、‘测试2’、‘测试3’];
var i=0;
addColumns();
函数addColumns(){
如果(i
假设执行是独立于值的(即一个不依赖于前一个的值),而是顺序执行的(它们必须以确定的顺序往返完成):
这将对一系列ajax请求进行排队,这些请求只有在前一个请求完成后才会启动。错误处理留给读者作为练习。如果呼叫不一定要按特定顺序完成,那么这样会更干净:
let allDone = Promise.all(titles.map(title => postToSP.createColumns...));
无论哪种方式,现在您都有了一个承诺,当所有异步调用完成时,该承诺将得到解决。ES2017:您可以将异步代码包装在函数中(比如XHRPost),返回一个承诺(承诺中的异步代码) 然后在for循环内调用函数(XHRPost),但使用神奇的wait关键字。:)
让http=newXMLHttpRequest();
让url为空http://sumersin/forum.social.json';
函数XHRpost(i){
返回新承诺(函数(解析){
让params='id=nobot&%3Aoperation=social%3AcreateForumPost&subject=Demo1'+i+'&message=Here%20是%20Demo&uu charset=UTF-8';
http.open('POST',url,true);
http.setRequestHeader('Content-type','application/x-www-form-urlencoded');
http.onreadystatechange=函数(){
log(“完成”+i+“>”+http.readyState);
如果(http.readyState==4){
console.log('SUCCESS:',i);
解决();
}
}
http.send(params);
});
}
for(设i=1;i<5;i++){
等待XHRpost(i);
}
为什么调用需要按顺序执行?顺序有那么重要吗?它们不需要按顺序排列,但ShrePoint在尝试同时写入所有3个时会抛出一个错误A ok。然后,一定要使用我回答中的第一个模式,因为下一个电话直到前一个往返行程才会被触发。第二种方法是同时进行。
let allDone = Promise.all(titles.map(title => postToSP.createColumns...));