seo整站优化技术培训,上海网站制作策,成都高端响应式网站开发,网站建设怎样核算在JavaScript中#xff0c;Promise是一种用于异步编程的构造函数#xff0c;它提供了更好的处理异步操作的方式#xff0c;相较于传统的回调函数更易于管理和避免回调地狱。Promise有三种状态#xff1a;Pending#xff08;进行中#xff09;、Resolved#xff08;已完成…在JavaScript中Promise是一种用于异步编程的构造函数它提供了更好的处理异步操作的方式相较于传统的回调函数更易于管理和避免回调地狱。Promise有三种状态Pending进行中、Resolved已完成、Rejected已失败。
以下是Promise的一些常见用法 Promise构造函数 new Promise((resolve, reject) {// 异步操作if (/* 成功条件 */) {resolve(value); // 当异步操作成功时调用resolve函数将Promise的状态变为Resolved并传递结果值} else if (/* 失败条件 */) {reject(error); // 当异步操作失败时调用reject函数将Promise的状态变为Rejected并传递错误原因}
});resolve() resolve是Promise构造函数传入的函数之一当你确定异步操作成功时调用它使Promise状态变为Resolved并传递成功的值给后续的.then或.catch链中的回调函数。 Promise.race() Promise.race(iterable)方法接受一个Promise对象的可迭代集合如数组只要这个集合中的任何一个Promise变为Resolved或Rejected状态Promise.race就会返回的那个率先改变状态的Promise的结果无论是Resolved还是Rejected。 let p1 fetch(url1);
let p2 fetch(url2);Promise.race([p1, p2]).then(response {// 第一个fetch请求完成后的响应
}, error {// 第一个fetch请求抛出的错误
});Promise.all() Promise.all(iterable)方法则是等待可迭代集合中的所有Promise全部变为Resolved状态然后返回一个新的Promise这个Promise在所有输入的Promise都变为Resolved时才会变为Resolved并且它的结果是一个数组包含了所有输入Promise的结果。 let p1 fetch(url1);
let p2 fetch(url2);Promise.all([p1, p2]).then(responses {// responses是一个数组包含了两个fetch请求的结果
}, error {// 如果任何一个fetch请求失败了这里的error将是第一个失败的请求的错误
});.then() 和 .catch() promise.then(onFulfilled, onRejected)方法用于指定Promise成功或失败后的回调函数onFulfilled会在Promise被resolve时调用onRejected会在Promise被reject时调用。promise.catch(onRejected)专门用于处理Promise失败的情况相当于.then(null, onRejected)。
通过这些API开发人员可以方便地处理异步流程控制形成更加清晰和易于维护的代码。
async function runParallel(maxConcurrency, source, iteratorFn) {const ret []const executing []for (const item of source) {const p Promise.resolve().then(() iteratorFn(item, source))ret.push(p)if (maxConcurrency source.length) {const e p.then(() executing.splice(executing.indexOf(e), 1))executing.push(e)if (executing.length maxConcurrency) {await Promise.race(executing)}}}return Promise.all(ret)
}这是一个实现了并发限制的异步函数名为runParallel它接受三个参数
maxConcurrency整数表示允许同时执行的任务的最大数量。source可迭代对象比如数组其中包含一系列待处理的项。iteratorFn一个迭代器函数它接受两个参数当前正在处理的项 (item) 和源数组 (source)并返回一个Promise。此函数用于执行针对每一项的操作。
函数的主要逻辑如下
初始化一个空数组ret用来存放每个任务对应的Promise。初始化一个空数组executing用来跟踪当前正在执行的任务即Promise。
接着遍历source中的每一项
创建一个Promisep在其内部调用iteratorFn函数处理当前项并立即resolve该Promise。将Promise p 添加到结果数组ret中。如果当前已执行的任务数量executing.length小于等于最大并发数maxConcurrency 当Promise p 完成时通过.then()方法从executing数组中移除自身。将Promise p 在其完成回调上添加了删除自身的逻辑加入到executing数组中。如果executing数组长度达到了maxConcurrency就等待数组中任意一个Promise完成通过Promise.race(executing)实现。
最后函数返回Promise.all(ret)这意味着它会等待所有异步任务都完成之后才返回一个Promise这个Promise在resolve时会带有所有任务的最终结果组成的数组。
总之runParallel函数是用来并发执行一系列任务的同时控制并发任务的数量不超过给定的最大并发数maxConcurrency。