如何通过JavaScript的Promise限制并发执行的网络请求数量?
- 内容介绍
- 文章标签
- 相关推荐
本文共计477个文字,预计阅读时间需要2分钟。
一、场景设定+假设存在这样一种场景:现有+30个异常请求需要发送,但受某些因素限制,我们须将同一时刻的请求数量控制在5个以内,同时还要尽可能快速地获取响应结果。
一、场景
假设现在有这么一种场景:现有 30 个异步请求需要发送,但由于某些原因,我们必须将同一时刻并发请求数量控制在 5 个以内,同时还要尽可能快速的拿到响应结果。
如图所示:
上图这样的排队和并发请求的场景基本类似,窗口只有三个,人超过三个之后,后面的人只能排队了。
二、串行和并行
- 串行:一个异步请求完了之后在进行下一个请求
- 并行:多个异步请求同时进行
串行举例:
var p = function () { return new Promise(function (resolve, reject) { setTimeout(() => { console.log("1000"); resolve(); }, 1000); }); }; var p1 = function () { return new Promise(function (resolve, reject) { setTimeout(() => { console.log("2000"); resolve(); }, 2000); }); }; var p2 = function () { return new Promise(function (resolve, reject) { setTimeout(() => { console.log("3000"); resolve(); }, 3000); }); }; p() .then(() => { return p1(); }) .then(() => { return p2(); }) .then(() => { console.log("end"); });
如示例,串行会从上到下依次执行对应接口请求。
并行举例:
通常,我们在需要保证代码在多个异步处理之后执行,会用到:
Promise.all((promises: [])).then((fun: function));
Promise.all可以保证,promises数组中所有promise对象都达到resolve状态,才执行then回调。
var promises = function () { return [1000, 2000, 3000].map((current) => { return new Promise(function (resolve, reject) { setTimeout(() => { console.log(current); }, current); }); }); }; Promise.all(promises()).then(() => { console.log("end"); });
这时候考虑一个场景:
如果你的promises数组中每个对象都是www.jb51.net/article/211898.htm
2、www.jb51.net/article/212277.htm
本文共计477个文字,预计阅读时间需要2分钟。
一、场景设定+假设存在这样一种场景:现有+30个异常请求需要发送,但受某些因素限制,我们须将同一时刻的请求数量控制在5个以内,同时还要尽可能快速地获取响应结果。
一、场景
假设现在有这么一种场景:现有 30 个异步请求需要发送,但由于某些原因,我们必须将同一时刻并发请求数量控制在 5 个以内,同时还要尽可能快速的拿到响应结果。
如图所示:
上图这样的排队和并发请求的场景基本类似,窗口只有三个,人超过三个之后,后面的人只能排队了。
二、串行和并行
- 串行:一个异步请求完了之后在进行下一个请求
- 并行:多个异步请求同时进行
串行举例:
var p = function () { return new Promise(function (resolve, reject) { setTimeout(() => { console.log("1000"); resolve(); }, 1000); }); }; var p1 = function () { return new Promise(function (resolve, reject) { setTimeout(() => { console.log("2000"); resolve(); }, 2000); }); }; var p2 = function () { return new Promise(function (resolve, reject) { setTimeout(() => { console.log("3000"); resolve(); }, 3000); }); }; p() .then(() => { return p1(); }) .then(() => { return p2(); }) .then(() => { console.log("end"); });
如示例,串行会从上到下依次执行对应接口请求。
并行举例:
通常,我们在需要保证代码在多个异步处理之后执行,会用到:
Promise.all((promises: [])).then((fun: function));
Promise.all可以保证,promises数组中所有promise对象都达到resolve状态,才执行then回调。
var promises = function () { return [1000, 2000, 3000].map((current) => { return new Promise(function (resolve, reject) { setTimeout(() => { console.log(current); }, current); }); }); }; Promise.all(promises()).then(() => { console.log("end"); });
这时候考虑一个场景:
如果你的promises数组中每个对象都是www.jb51.net/article/211898.htm
2、www.jb51.net/article/212277.htm

