Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript异步循环_Javascript_Asynchronous_Recursion - Fatal编程技术网

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

我想知道是否有更好的方法在JavaScript中执行异步循环?我一直在使用下面的递归方法,但我觉得可能有更干净的方法。如有任何链接/建议,将不胜感激。谢谢

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...));