2016-04-16 8 views
2

私はある時間に同じプロセスで多数のAjax呼び出しを行うネイティブJavaScriptアプリケーションを作成しています。通常のforループを実行してすぐにそれらをすべて実行するのではなく、私はAjaxコールが完了するのを待ってから次のコールを実行するのを待っていました。Ajaxリクエストでループを約束する

私は次のようにこれを行うことができたのStackOverflowの助けを借りて:

function ajaxCall(index) { 
    return new Promise(function(resolve) { 
     // Ajax request { 
      resolve(); 
     // } 
    }); 
} 

Promise.resolve(0).then(function loop(i) { 
    if (i < length) { 
     return ajaxCall(i).thenReturn(i + 1).then(loop); 
    } 
}).then(function() { 
    // for loop complete 
}); 


Promise.prototype.thenReturn = function(value) { 
    return this.then(function() { 
     return value; 
    }); 
}; 

しかし、これは私にとっては遅すぎます。私は量を制限することができるように現在いくつかのAjax呼び出しが処理中であることを追跡するvarを保持できるようにしたい。

私は複数のことを試しましたが、私はininiteループを実行し続けているか、目的の結果に達していません。

特定の数値で制限された複数の操作を実行するには、Promise forループを使用して非同期Ajaxを呼び出しますか?

答えて

0

Promise.allのバージョンでは、約束よりむしろ非同期関数の配列と、同時操作数の上限が必要です。以下のような何か:

Promise.allFuncs = (funcs, n) => { 
 
    n = Math.min(n, funcs.length); 
 
    var results = []; 
 
    var doFunc = i => funcs[i]().then(result => { 
 
    results[i] = result; // store result at the correct offset 
 
    if (n < funcs.length) { 
 
     return doFunc(n++); 
 
    } 
 
    }); 
 
    // start only n simultaneous chains 
 
    return Promise.all(funcs.slice(0, n).map((p, i) => doFunc(i))) 
 
    .then(() => results); // final result 
 
}; 
 

 
// --- Example: --- 
 

 
var log = msg => div.innerHTML += msg + "<br>"; 
 
var wait = ms => new Promise(resolve => setTimeout(resolve, ms)); 
 

 
var example = ['a','b','c','d','e','f'].map(name => 
 
() => (log("started "+name),wait(2000).then(() => (log("ended "+ name), name)))); 
 
    
 
Promise.allFuncs(example, 2) 
 
.then(results => log("Results: "+ results)) 
 
.catch(log);
<div id="div"></div>