Promise使用和基本问题

一、Promise基本使用:
代码演示:
//1、创建一个新的Promise对象
        const P = new Promise((resolve,reject) => {//执行器函数
            setTimeout(() => {
                const time = Date.now()//如果当前时间是偶数就代表成功,否则代表失败
                if(time % 2 == 0){
                  //3.1如果成功了,调用resolve(value)
                    resolve('成功的数据:time='+time);
                }else{
                 //3.2如果失败了,调用reject(reason)
                    reject('失败的数据:time='+time);
                }
            },1000);
        })
        P.then(
            value => { 
                //接受得到成功的value数据 onResolved
                console.log("成功的回调",value); 
            },
            reason => { 
                //接收得到失败的reason数据 onRejected
                console.log("失败的回调",reason);
            }
        )
二、Promise基本问题01

1、如何改变Promise的基本状态:

  • 1)resolve(value):如果当前是pedding就会变为resolved。(pending只会改变一次)
  • 2)rejected(reason):如果当前是pendding就会变为rejected。
  • 3)抛出异常:如果当前是peding就会变为rejected。

2、一个Promise指定多个成功\失败回调函数,都会调用吗?
  当Promise改变为对应状态时都会调用

代码:

const p = new promise((resolve,reject) => {
	resolve(1);
	//reject(2);
	//throw 3;
})
.then(
	value => {
		console.log('value',value);//value 1
	},
	reason =>{
		console.log('reason',reason);// reason 2
	}
)
.then(
	value => {
		console.log('value',value);//value undefined  
	},
	reason =>{
		console.log('reason2',reason);
	}
)

注:当执行 resolve(1)(结果会是 value 1,value undefined);当执行代码reject(3) (结果会是reason 3 ,value undefined);当前执行throw(2) (结果会是reason 2,value undefined)

三、Promise基本问题02

改变Promise状态和指定回调函数谁先谁后?

  • 1)都有可能,正常情况下是先指定回调函数再改变状态,但也可以先改变状态再指定回调函数。

  • 2)如何先改状态再指定回调函数?
      可以直接调用resolve()或者reject();
      也可以延迟更长时间再调用 .then;

  • 3)什么时候才能得到数据?
      如果是先指定的回调,当状态发生改变时,回调函数就会调用,得到数据。
      如果是先改变的状态,当指定回调时,回调函数就回调用,得到数据。

代码:先指定回调函数

//异步回调函数
const p = new Promise((resolve,reject) => {
	//同步回调会立即执行
	console.log("Promise的执行器函数");
	//加入定时器,就会变成异步回调函数,不会立即执行
	setTimeout(()=>{
        resolve(1);
    },1000)
    console.log("Promise的执行器函数执行完了");
})
.then(
	value => {
      console.log("状态改变得到数据");
      console.log(value);
    }
)

在这里插入图片描述
注:因为加有定时器,我们会看到 ‘状态改变得到数据’ 和 ‘1’是会延迟一秒后才出现。

代码:先改变状态

//异步操作,不会立即执行
    const  p = new Promise((resolve,reject) => {
        //同步操作 会立即执行
        console.log("Promise的执行器函数");
        resolve(1);
        console.log("Promise的执行器函数执行完了");
    })
    .then(
        value => {
            console.log("状态改变得到数据");
            console.log(value);
        }
        
    )

在这里插入图片描述
注:这个里面的数据是没有延出现的。

四、Promise基本问题03

Promise.then()返回的新的Promise的结果状态由什么决定?

  • 1)简单表达:由then()指定的回调函数执行的结果决定。

  • 2)详细表达:
      1、如果抛出异常,新的Promise变为rejected,reason为抛出的异常。
      2、如果返回的是非Promise的任意值,新promise变任意值,value为返回值。
      3、如果返回的是另一个新promise,此promise的结果就会成为新promise的结果。

    代码:抛出异常

const p = new Promise((resolve,reject) => {
            resolve(1);   
        })
.then(
   value => {
       console.log("onResolved value:"+value); //onResolved value: 1
       throw 3; 
    },
    reason => {
         console.log("onRejected reason:"+reason);
	}
 )
.then(
    value => {
       console.log("onResolved2 value:"+value);
     },
     reason => {
        console.log("onRejected2 reason:"+reason); //onRejected2 reason: 3
     }
)

代码:返回非promise对象

        const p = new Promise((resolve,reject) => {
            resolve(1);   
        })
        .then(
            value => {
                console.log("onResolved value:"+value); //onResolved value: 1
                return 3;
            },
            reason => {
                console.log("onRejected reason:"+reason);
            }
        )
        .then(
            value => {
                console.log("onResolved2 value:"+value);//onResolved value: 3
            },
            reason => {
                console.log("onRejected2 reason:"+reason);
            }
        )
        

代码:返回Promise对象

		const p = new Promise((resolve,reject) => {
            resolve(1);   
        })
        .then(
            value => {
                console.log("onResolved value:"+value); //onResolved value: 1
                return Promise.resolve(1);
            },
            reason => {
                console.log("onRejected reason:"+reason);
            }
        )
        .then(
            value => {
                console.log("onResolved2 value:"+value); //onResolved2 value: 1
            },
            reason => {
                console.log("onRejected2 reason:"+reason);
            }
        )
		const p = new Promise((resolve,reject) => {
            resolve(1);   
        })
        .then(
            value => {
                console.log("onResolved value:"+value); //onResolved value: 1
                return Promise.reject(1);
            },
            reason => {
                console.log("onRejected reason:"+reason);
            }
        )
        .then(
            value => {
                console.log("onResolved2 value:"+value);
            },
            reason => {
                console.log("onRejected2 reason:"+reason); //onRejected2 reason: 1
            }
        )
五、Promise基本问题05

Promise 如何串联多个操作任务?

  • 1)promise的then()返回一个新的promise,可以开成then()的链式调用
  • 2)通过then的链式调用串联多个同步/异步任务
		new Promise((resolve,reject) => {
            setTimeout(()=>{
                resolve(1);
                console.log("执行异步操作一");
            },1000)
        }).then(
            value => {
                console.log("执行异步任务一的结果:"+value);
                console.log("执行同步操作二");
                return 2;
            }
        ).then(
            value => {
                console.log("执行同步任务二的结果:"+value);
                return new Promise((resolve,reject) => {
                    setTimeout(()=>{
                        resolve(3);
                        console.log("执行异步操作三");
                    },1000)
                })
            }
        ).then(
            value => {
                console.log("执行异步操作三的结果"+value);
            }
        )

在这里插入图片描述

六、Promise基本问题05

1、Promise异常传透?

  • 1)当使用promise的then链式调用时,可以在最后指定失败的回调
  • 2)前面任何操作出了异常,都会传到最后失败的回调中处理

2、中断promise链?

  • 1)当使用promise的then链式调用时,在中间中断,不再调用后面的回调函数
  • 2)方法:在回调函数中返回一个pendding状态的promise对象

代码演示:

		new Promise((resolve,reject) => {
            reject(1);
        }).then(
            value => {
                console.log('onResolved1()',value);
                return 2;
            }
        ).then(
            value => {
                console.log('onResolved2()',value);
                return 3;
            }
            //相当于 reason => {throw reason}
        ).then(
            value => {
                console.log('onResolved3()',value);
                return 4;
            }
        ).catch(
            reason => {
                console.log("失败"+reason); //失败 1
                return new Promise(()=>{}); //中断promise链
            },
            //中断Promise链
            
        ).then(
            value => {
                console.log('onResolved2()',value);
            },
            //相当于 reason => {throw reason}
            reason => {
                console.log("失败2"+reason);
            }
        )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaScript中,setInterval和Promise的执行顺序是根据事件循环机制来确定的。事件循环是JavaScript用来处理异步操作的一种机制。首先,让我们来了解一下事件循环的基本原理。 JavaScript是单线程执行的,意味着同时只能执行一段代码。当某一段代码正在执行时,其他任务必须等待。这种执行方式也被称为"阻塞式执行"。JavaScript中的任务队列用于存储等待执行的任务。一旦当前任务执行完毕,事件循环会从任务队列中取出下一个任务并执行。 对于setInterval和Promise的执行顺序问题,具体的执行顺序取决于它们被添加到任务队列的时间和优先级。根据引用的说明,事件循环的优先级从高到低依次是:主代码块 > setImmediate > MessageChannel > setTimeout / setInterval。 如果存在多个setInterval和Promise任务,它们会根据优先级和添加到任务队列的顺序依次执行。setInterval的任务会按照指定的时间间隔重复执行,而Promise的任务则会在其他任务执行完毕后被执行。 需要注意的是,Promise中的then方法是异步执行的,它会在当前任务执行完毕后被添加到任务队列中,等待执行。因此,即使是在Promise的then方法中使用了setTimeout,它也会按照任务队列的顺序被执行。具体的执行顺序可能因为任务队列中的任务数量和优先级而有所不同。 综上所述,setInterval和Promise的执行顺序是根据它们被添加到任务队列的时间和优先级来确定的。具体的执行顺序可以通过事件循环机制来理解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [js 关于setTimeout和Promise执行顺序问题](https://blog.csdn.net/zlzbt/article/details/100577954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaScript--Promise执行顺序](https://blog.csdn.net/qq_45633813/article/details/126781947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值