当前位置:网站首页>Promise 一: 基本问题
Promise 一: 基本问题
2022-08-03 09:29:00 【要不要买菜啊】
目录
1. Promise 是什么
理解
1. 抽象表达:
2. promise 的状态改变
3.promise 的基本流程
4. promise 的基本使用
使用 2: 使用 promise 封装基于定时器的异步
2. 为什么要用 Promise?
2.1. 指定回调函数的方式更加灵活
Promise之前的旧方案都是使用回调函数完成异步编程的操作
1、fs 文件操作 如 NodeJS
require('fs').requireFile('./index.html',(error,data)=>{})
2、数据库操作 如 MongoDB MySQL
3、 AJAX 网络请求
$.get('/server',(data)=>{})
4、定时器 setTimeout(()=>{},2000)
2. promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函
2.2. 支持链式调用, 可以解决回调地狱问题
setTimeout(function () { //第一层
console.log('武林要以和为贵');
setTimeout(function () { //第二程
console.log('要讲武德');
setTimeout(function () { //第三层
console.log('不要搞窝里斗');
}, 1000)
}, 2000)
}, 3000)
使用promise就可以解决这个问题
function fn(str){
var p=new Promise(function(resolve,reject){
//处理异步任务
var flag=true;
setTimeout(function(){
if(flag){
resolve(str)
}
else{
reject('操作失败')
}
})
})
return p;
}
fn('武林要以和为贵')
.then((data)=>{
console.log(data);
return fn('要讲武德');
})
.then((data)=>{
console.log(data);
return fn('不要搞窝里斗')
})
.then((data)=>{
console.log(data);
})
.catch((data)=>{
console.log(data);
})
2. 回调地狱的缺点?
3. 如何使用 Promise?
3.1. API
// 1.创建一个新的promise对象
const p = new Promise((resolve, reject) => {
// 执行器函数 同步回调
// 2.执行异步操作任务
setTimeout(() => {
const time = Date.now();
// 如果当前时间是偶数代表成功,否则代表失败
// 3.1 如果成功了,调用resolve(value)
if (time % 2 == 0) {
resolve("成功的数据, time=" + time);
} else {
// 3.2 如果失败了,调用reject(reason)
reject("失败的数据, time=" + time);
}
});
}, 1000);
//如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
//如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
p.then(
(value) => {
// 接收得到成功的value数据
console.log("onResolved", value);
},
(reason) => {
// 接收得到失败的reason数据
console.log("onRejected", reason);
}
);
let p1 = new Promise((resolve, reject) => {
resolve('OK');
})
// let p2 = Promise.resolve('Success');
let p2 = Promise.reject('Error');
let p3 = Promise.resolve('Oh Yeah');
//
const result = Promise.all([p1, p2, p3]);
console.log(result); // Uncaught (in promise) Error
Promise.race 方法: (promises) => {}
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
},1000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('failed')
}, 500)
})
Promise.race([p1, p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error) // 打开的是 'failed'
})
边栏推荐
猜你喜欢
固件工程师到底是干什么?
Industry SaaS Microservice Stability Guarantee Actual Combat
MySQL 主从切换步骤
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现
cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
When deleting a folder, the error "Error ox80070091: The directory is not empty" is reported. How to solve it?
MySQL 中 is null 和 =null 的区别
Redis和MySQL如何保持数据一致性
dflow入门3——dpdispatcher插件
索引(三)
随机推荐
window的供选数据流
PostgreSQL的架构
索引(三)
GO开发环境配置
【LeetCode】622. Design Circular Queue
AUC的两种计算方式
dflow入门5——Big step & Big parameter
milvus
兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00
验证浮点数输入
"Easy to use" websites that others don't know, make you more efficient
Flink Yarn Per Job - Submit application
Index (3)
二叉查找树的综合应用
SQL Daily Practice (Nioke New Question Bank) - Day 5: Advanced Query
2022最新整理软件测试常见面试题附答案
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现
深度学习之 10 卷积神经网络2
Redis和Mysql数据同步的两种方案
ORA-06512 数字或值错误字符串缓冲区太小