首页 > 其他分享 >用思维导图梳理的 Promise,看完这篇就够了

用思维导图梳理的 Promise,看完这篇就够了

时间:2024-10-22 19:19:31浏览次数:10  
标签:resolve const 导图 reject 这篇 Promise error console

1.对 Promise 的理解

理解

2.什么是Promise链?

promise链

let promise=new Promise((resolve,reject)=>{
	const control=true
	control && resolve(res); //如果control为true,就执行resolve(res)
	reject(err)				//若为false,就执行reject(err)
}
promise
  .then( res=> console.log(res), err=>console.log(err))
  .catch( error => console.log(error))
  .finally( () =>console.log('finally#1'));

3.Promise有哪些静态方法?

静态方法

比较常用的是 promise.all() 和 promise.race()

1.promise.all() 示例

const promise1 = fetch('https://api.example1.com/data');
const promise2 = fetch('https://api.example2.com/data');
const promise3 = fetch('https://api.example3.com/data');

Promise.all([promise1, promise2, promise3])
  .then((results) => {
    return Promise.all(results.map(r => r.json()));
  })
  .then((data) => {
    console.log(data); // data 是一个包含了三个 API 响应结果的数组
  })
  .catch((error) => {
    console.error('其中一个请求失败:', error);
  });

2.promise.race() 示例

const p1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'p1 完成');
});
const p2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'p2 完成');
});

Promise.race([p1, p2])
  .then((result) => {
    console.log(result); // 'p2 完成', 因为 p2 比 p1 完成得更快
  })
  .catch((error) => {
    console.error('有一个 promise 被拒绝:', error);
  });

// 超时控制的示例
const fetchWithTimeout = new Promise((resolve, reject) => {
  setTimeout(() => reject(new Error('请求超时')), 5000);
});

Promise.race([fetch('https://api.example.com/data'), fetchWithTimeout])
  .then((result) => {
    return result.json();
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error('错误:', error);
  });

3.promise.allSettled() 示例

// Promise.allSettled 示例
const promise4 = Promise.resolve(3);
const promise5 = new Promise((resolve, reject) => {
  setTimeout(reject, 100, 'error');
});
const promise6 = Promise.resolve(42);

Promise.allSettled([promise4, promise5, promise6]).then(results => {
  results.forEach(result => console.log(result));
  // {status: 'fulfilled', value: 3}
  // {status: 'rejected', reason: 'error'}
  // {status: 'fulfilled', value: 42}
});

4.基于promise 的async/await语法:

自从ES2017引入 async/await 语法以后, 处理异步操作变得更加直观明了。
不过, 本质上,async 声明一个函数是异步的, await 会暂停异步函数的执行, 等待Promise解决后再继续执行。

let myPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("Success!");
    }, 1000);
});

myPromise.then(result => {
    console.log(result); // "Success!"
}).catch(error => {
    console.log(error);
});

async function asyncFunction() {
    try {
        let result1 = await promise1; // 等待 promise1 完成
        console.log(result1);
        let result2 = await promise2; // 等待 promise2 完成
        console.log(result2);
    } catch (error) {
        console.error(error);
    }
}

asyncFunction();

在上面的代码中, 函数 asyncFunc 在碰到 await 关键字时, 会暂停执行, 知道myPromise 被resolved 之后继续执行。

拓展: 使用 Aysnc/Await 时需要注意异常处理, 可以用 try…catch 语句来捕获异常。

5.如何用 JS 实现Promise.all()方法? 请写出具体代码

function myPromiseAll(promises){
	return new Promise((resolve,reject)=>{
		if(!Array.isArray(promises))	reject('typeError')
		promises.length === 0 && resolves(promises)
		const results=[]
		let count=0
		promises.forEach((p,index)=>{
			Promise.resolve(p).then(res=>{
				results[index]=res;
				count++
				count === promises.length && resolve(results)
			},err=>{
				reject(err)
			})
		})
	})
}

6.如何用 JS 实现Promise.race()方法? 请写出具体代码

function myPromiseRace(promises){
	return new Promise((resolve,reject)=>{
		if(!Array.isArray(promises))	reject('typeError')
		promises.length === 0 && resolves(promises)
		promises.forEach(p=>{
			Promise.resolve(p).then(res=>resolve(res),err=>reject(err))
		})
	})
}

// 测试代码
const p1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one');
});

const p2 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'two');
});

myPromiseRace([p1, p2]).then(value => {
    console.log(value); // "two"
}).catch(error => {
    console.log(error);
});

7. promise.all() .race() .allSettled() .any()的区别

静态方法描述
.all(promises)等待数组内所有promise resolve, 或其中一个发生reject
.race(promises)返回最快resolve or reject的那一个promise
.allSettled(promises)等待所有promise完成,无论resolvereject , 最后返回每一个promise的结果
.any(promises)只要有一个promise resolve,就返回这个promise 的值。如果所有promise都reject, 则返回一个AggregateError对象(报错)

8. 使用Promise.race() 实现一个带有超时控制的请求函数

function fetchWithTimeout(url, timeout) {
    const fetchPromise = fetch(url);
    const timeoutPromise = new Promise((undefined, reject) => {
        setTimeout(() => reject(new Error('Request timed out')), timeout);
    });

    return Promise.race([fetchPromise, timeoutPromise]);
}

// 使用示例
fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', 1000)
    .then((response) => response.json())
    .then((data) => console.log(data))
    .catch((error) => console.error('Error:', error));

9.JS实现一个带并发限制的异步调度器 [字节面试题]

js实现一个带并发限制的异步调度器, 保证同时运行的任务最多有两个。完善代码中的 Scheduler 类, 使得以下程序能正确输出:

class Scheduler{
    add(promiseCreator){
        //...
    }
    //...
}

const timeout=time=> new Promise(resolve=>{
    setTimeout(resolve,time);
})

const scheduler=new Scheduler();
const addTask=(time, order)=>{
    scheduler.add(()=>timeout(time)).then(()=> console.log(order))
}

addTask(1000,'1')
addTask(500,'2')
addTask(300,'3')
addTask(400,'4')

//output: 2 3 1 4

答案:

class Scheduler{
    constructor(){
        this.queue = new Set()
    }
    add(promiseCreator){
        if(this.queue.size>=2){
            return Promise.race(Array.from(this.queue).map(i=>i)).finally(()=>this.add(promiseCreator))
        }else{
            const proInstance = promiseCreator()
            this.queue.add(proInstance)
            proInstance.finally(()=>{
                this.queue.delete(proInstance)
            })
            return proInstance
        }
    }
}

const timeout=time=> new Promise(resolve=>{
    setTimeout(resolve,time);
})

const scheduler=new Scheduler();
const addTask=(time, order)=>{
    scheduler.add(()=>timeout(time)).then(()=> console.log(order))
}

addTask(1000,'1')
addTask(500,'2')
addTask(300,'3')
addTask(400,'4')

标签:resolve,const,导图,reject,这篇,Promise,error,console
From: https://blog.csdn.net/Mz0127/article/details/143161780

相关文章

  • 不要把异常当做业务逻辑,这性能可能你无法承受,这篇博文里面的评论的看到的知乎上的内容
    百度多了你就明白:它也许有用,但它封印了你精进计算机英语的机会。Google多了你就明白:各地大佬们的文章很Nice,但它们仅是你技术知识体系的精华补充。开始读书了你就明白:你以往东拼西凑几十篇烂文才明白的事,书上那几页纸都写着,而且详细的很。接触到国内外大社的经典书后你就明......
  • 第七周学习思维导图
     code代码为:graphLR  A[密码系统设计第七周]-->B[《WindowsC/C++加密解密实战》]  B-->C[第十章]  C-->T[对称加密]  C-->U[非对称加密]  C-->V[哈希函数]  T-->X[AES]  U-->d[RSA]  V-->e[SHA-256]  B-->......
  • 【Coroutines】Implement JavaScript Promise by Kotlin Coroutine
    Expecteduseasynctolaunchaasynctaskuseawaittowaitresultfromotherworkasync{valuser=await<String>{loadUserInfo()}println(user)println("asyncreturned")}println("asyncnotreturn")Implementat......
  • 500强企业是如何进行数据安全建设的?看这篇就够了
    500强企业对于数据安全的保护尤其重视,所以在数据安全建设方面通常采取多层次的策略,具体包括以下几个方面:风险评估与管理:定期进行全面的风险评估,识别数据安全风险,制定相应的管理策略。安全政策与标准:制定并实施严格的数据安全政策和标准,确保所有员工和合作伙伴遵循。技术防护措......
  • Promise.each()
    原文:http://bluebirdjs.com/docs/api/promise.each.html 正文:Promise.each是一个异步迭代函数,它接受一个可迭代对象(例如数组)或一个可迭代对象的Promise,并在每个元素上执行给定的迭代器函数。如果元素是一个Promise,迭代器会等待它解决后再继续。迭代器函数的签名是(value,i......
  • promise
    Promisepromise是ES6引入的异步编程的新的解决方案,从语法上来说,它是一个构造函数,可以实例化对象,封装异步操作,获取成功和失败的结果,其优点是支持链式调用可以解决回调地狱问题指定回调函数的方式更为灵活1.准备promise是ES6引入的进行异步编程的新的解决方案,从语法上来说,它就......
  • 挑战1000道javascript手写题之实现Promise.all(9)
    Promise.all介绍Promise.all方法接收一个数组作为参数,这个参数数组的元素也都是promise实例,该方法返回一个promise示例。constp=Promise.all([p1,p2,p3]);p的状态由p1、p2、p3决定,p最后的状态要么是变成fulfilled,要么变成rejected。变成fulfilled:只有当p1、p2、p3......
  • [Javascript] Write Promise.all()
    Promise.myAll=function(promises){letres,rej;constp=newPromise((resolve,reject)=>{res=resolve;rej=reject;});leti=0;letresult=[];//sincePromise.allcantakeanyiterableasinput//tocheckwhether......
  • 图论day64 :最短路径算法 | SPFA(Bellman_ford的队列优化版)、城市间货物运输 I、Ⅱ、Ⅲ
    图论day64:最短路径算法|SPFA(Bellman_ford的队列优化版)、94.城市间货物运输I(卡码网)【SPFA算法+邻接表优化】、95.城市间货物运输II(判断负权回路)、96.城市间货物运输III【已知有负权回路,该如何计算】、Bellman_ford算法思维导图汇总SPFA(Bellman_ford的队列优化版)94......
  • 学习编程是自学好,还是报班好?看完这篇你就明白了!
    编程已经成为现代社会一项重要的技能,无论是为了提升职业竞争力还是为了满足个人兴趣,越来越多的人想要学习编程。然而,面对学习编程的不同选择,很多人会问:“学习编程是自学好,还是报班好?”这其实是因人而异的,因为每种方式都有各自的优点和不足。本文将详细分析自学和报班两种方式......