ES6异步承诺
ES6 Asynchronous promises
我还是ES6的初学者。我试图创建一个函数发送一个http(s)请求的逻辑,当你发送一个http(s)请求。如果有5个或更多正在进行的请求,则必须等待一个其中一个完成后,您就可以处理下一个请求了。当响应码不是200时,需要重试3次。如果响应代码后重试3次仍然不是200,那么应该执行错误函数。我还想接收响应体的JSON数据作为函数参数。
function httpGet(url) {
return new Promise(
function (resolve, reject) {
const request = new XMLHttpRequest();
request.onload = function () {
if (this.status === 200) {
// Success
resolve(this.response);
} else {
// Something went wrong (404 etc.)
reject(new Error(this.statusText));
}
};
request.onerror = function () {
reject(new Error(
'XMLHttpRequest Error: '+this.statusText));
};
request.open('GET', url);
request.send();
});
}
这是我到目前为止所做的。由于
承诺回调的一般队列:
// Helper to run a callback when a promise either resolves, or rejects.
function fin(promise, callback){
return promise.then(
value => (callback(), Promise.resolve(value)),
error => (callback(), Promise.reject(error))
);
}
function makeQueue(maxParallel){
const queue = [];
let inProgress = 0;
// Run the oldest queued task.
function run(){
const {resolve, reject, callback} = queue.shift();
inProgress++;
return fin(callback(), () => inProgress--).then(resolve, reject);
}
// If more tasks can run in parallel, start them
function dequeue(){
if (queue.length > 0 && inProgress < maxParallel) run().then(dequeue);
}
return function(callback){
return new Promise((resolve, reject) => {
queue.push({resolve, reject, callback});
dequeue();
});
}
}
然后使用队列来队列httpGet
:
const queue = makeQueue(5);
// Queue up httpGet calls.
function httpGetWithQueue(url){
return queue(() => httpGet(url));
}
然后用重试逻辑调用它:
// Call httpGet with queued processing, with the request tried
// up to three times.
function httpGetWithRetry(url){
let result = Promise.reject();
for (var i = 0; i < 3; i++){
result = result.catch(() => httpGetWithQueue(url));
}
return result;
}
相关文章:
- 为什么同步睡眠功能没有被承诺内异步化
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- Node JS异步承诺.所有问题
- 将异步工作流更改为承诺(蓝鸟)
- JQuery 承诺异步对话
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- 同步异步创建的承诺
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 使我的异步代码与setTimeout同步.我需要承诺吗
- 异步角度承诺和变量初始化
- 如何在节点中使用承诺一次并行异步多个请求
- 使用链式 Q 承诺异步加载的局部变量
- JavaScript 异步编程:承诺与生成器
- ngInit 不异步工作($q承诺)
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 多个条件异步递归函数和 jQuery 承诺
- JS承诺/异步澄清问题
- 承诺基础知识.如何承诺异步节点代码
- 使用异步.每个都有承诺-异步每个都永不停止
- 使用 Sinon.js 测试承诺/异步流