promise用法

promise是用来完成异步编程

前言

异步操作

setTime(()=>{console.log("我是异步的")},3000)
console,log("你可以立即看见我")
//我们会发现下面的先输出

但如果我们多次嵌套使用异步操作,就会造成回调地狱

setTimeout(function () { 
        console.log('第一层');
        setTimeout(function () {  
            console.log('第二程');
            setTimeout(function () {  
                console.log('第三层');
            }, 1000)
        }, 2000)
    }, 3000)

引入promise

这时promise就应运而生,利用promise中的fetch()向服务器发送一个fetch(“url”)请求用来动态更新页面中的内容,也就是Ajax

返回的是一个promise(承诺)对象,承诺这个请求会在某个时刻返回数据(异步)

然后利用then方法并传递一个回调函数

promise的链式调用

fetch("url")
.then((response=>{
    response.json//接收一个返回数据response,将转换为json字符串
))
.then((json)=>{})
.then(()=>{})
.then(()=>{})
//接收到的响应数据,会在第一个then处理后,传给第二个,并一直沿着该链向下传,称为链式调用
//即使有一个很长的链,代码也是向下增长,而不是向右增长
//又是返回的格式等会有错误,我们可以在尾部加上一个catch(),当返回有任何错误,直接调用catch
.catch((error)=>{console.log("error")})
.finally()//在链的最后调用,会用来做一些清理工作

async/await 是ES7提出的基于promise的解决异步的最终方案

首先使用async关键字将函数标记为异步函数

async function f(){
await()
}
f()
async function f(){
 const response = await fetch('url')
}
//await等待promise完成之后直接返回最终结果

误区

async function f(){
 const promiseA = await fetch("url")
 const promiseB = await fetch("url")
}
//当同时有两个await时,会等上一个await执行结束在执行下一条
//所以我们应将所有的promise用promise.all组合起来
async function f(){
 const promiseA = fetch("url")
 const promiseB = fetch("url") 
 const[a,b]= await promise.all([promiseA,promiseB]) 
}

在循环中使用异步不能用forEach()/map(),要使用传统的for循环

await 关键字只能在异步函数async下有效

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise是一种异步编程的解决方案,它可以避免回调地狱,使得异步操作更加清晰和易于维护。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当Promise处于pending状态时,可以转换为fulfilled或rejected状态,一旦转换为其中一种状态,就不可再转换为其他状态。 Promise的基本用法如下: ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 if (/* 异步操作成功 */) { resolve(value); // 将Promise状态设置为fulfilled,并将异步操作的结果传递给回调函数 } else { reject(error); // 将Promise状态设置为rejected,并将错误信息传递给回调函数 } }); promise.then((value) => { // 异步操作成功时的回调函数 }, (error) => { // 异步操作失败时的回调函数 }); ``` 另外,Promise还提供了一些静态方法,如Promise.resolve和Promise.reject,可以方便地创建已经处于fulfilled或rejected状态的Promise对象,以及Promise.all和Promise.race等方法,可以处理多个Promise对象的状态。 下面是一个使用Promise的例子,通过异步加载图片并在加载完成后显示图片: ```javascript function loadImageAsync(url) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = function() { resolve(img); }; img.onerror = function() { reject(new Error('Could not load image at ' + url)); }; img.src = url; }); } loadImageAsync('https://example.com/image.jpg') .then((img) => { document.body.appendChild(img); }) .catch((error) => { console.error(error); }); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值