关于promise讲解

ES6什么是回调地狱以及如何使用Promise解决

歌单id--->歌单列表id--->歌曲的信息

需要:一秒钟之后输出1,然后两秒钟之后输出2,然后三秒钟之后输出3

setTimeout(()=>{

console.log(1);

setTimeout(()=> {

console.log(2);

setTimeout(()=> {

console.log(3);

},3000)

},2000)

},1000)

function getData() {

return new Promise((resolve,reject)=>{

setTimeout(()=>{

console.log(1);

resolve(2)

},1000)

})

}

getData().then((value)=> {

return new Promise((resolve,reject)=>{

setTimeout(()=>{

console.log(value);

resolve(3)

},2000)

}).then((value)=>{

return new Promise((resolve,reject)=>{

setTimeout(()=>{

console.log(value);

},3000)

})

})

ES6中对Promise的理解以及应用场景

用于将多个Promise实例,包装成一个新的Promise实例

let p1=new Promise((resolve,reject)=>{

resolve("成功01")

})

let p2=new Promise((resolve,reject)=>{

//resolve("成功02")

reject("失败02的数据")

}).catch(reason=>console.log(reason))

let p3=new Promise((resolve,reject)=>{

//resolve("成功03")

reject("失败03的数据")

})

//参数可以不是数组,但是必须是iterator接口

let pAll = Promise.all([p1,p2,p3])

console.log(pAll);

//pAll的状态,由p1,p2,p3来决定,只有当这 三个都为成功,pAll才会成功

//但是有一个失败,那么就失败,这个时候第一个失败的实例的返回值,会传递给pAll的 回调函数

//如果作为参数的实例,自己定义了catch方法,那么它一旦rejected,不会触pAll的catch方法

pAll.then((value)=>{

console.log(value);

}).catch((reason)=>{

console.log(reason)

})

//多个请求结果合并在一起

function getBannerList(){

return new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve('轮播图的数据')

},1000)

})

}

function getMusicList(){

return new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve('歌曲列表的数据')

},2000)

})

}

function getCateList(){

return new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve('歌单分类的数据')

},3000)

})

}

function initLoad(){

let All = Promise.all([getBannerList(),getMusicList(),getCateList()])

//console.log(All)

All.then((value)=>{

console.log(value);

})

}

initLoad()

37.ES6中对Promise.race的用法以及应用场景

将多个Promise实例包装成一个新的Promise实例

let p1=new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve("P1成功")

},2000)

})

let p2=new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve("P2成功")

},1000)

})

//调用

const prace = Promise.race([p1,p2]);

console.log(prace);

  • Promise.race区别于Promise.all:只要实例中有一个先改变 状态,就会把这个实例的参数的返回值传给prace的回调函数

//使用 场景:请求超时提示

function request(){

return new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve("P1成功")

},4000)

})

}

function timeout(){

return new Promise((resolve,reject)=>{

setTimeout(()=>{

resolve("网络不佳,请求超时")

},3000)

})

}

promise.race([requeset(),timeout()]).then((value)=>{

console.log(value);

}).catch((reason)=>{

console.log(reason);

})

ES6中使用Promise封装ajax

http://localhost:3000/personalized?limit=10

function getJSON(url) {

return new Promise((resolve,reject)=>{

//创建一个实例对象

let xhr = new XMLHttpRequest();

//新建一个http请求

xht.open('GET',url,true);

//发送http请求

xhr.send(null)

//设置状态的监听函数

xhr.onreadystatechange = function() {

if (xhr.readyState !== 4) return //表示请求完成

//请求成功或者失败,需要改变promise实例的状态

if (xhr.status >= 200 && xhr.status <300){

resolve(xhr.responseText) //请求结果

} else {

reject(new Error(xhr.statusText))

}

}

//设置错误的监听函数

xhr.onerror = function() {

reject(new Error(xhr.statusText))

}

//设置响应数据的类型

//xhr.responseType = 'json'

})

}

getJSON('http://localhost:3000/personalized?limit=10').then((value)=>{

console.log(JSON.parse(value));

}).catch((reson)=>{

console.log(reason);

})

JS中ajax(Async Javascript and XML)的原理是什么?如何实现

原理:通过XMLHttpRequest对象来向服务器发送异步请求,从服务器获取数据,然后用js来操作DOM去更新页面

  • 实现过程:

    创建Ajax的核心对象XMLHttpRequest对象

    new XMLHttpRequest()实例化对象

    通过 XMLHttpRequest 对象的open()方法与服务器建立连接

    new XMLHttpRequest().open(method:表示请求方式,url:服务器的地址)

    构建请求所需的数据内容,并通过 XMLHttpRequest对象的send() 方法发送给服务器

    new XMLHttpRequest().send(body:发送的数据)

    如果使用get请求发送数据,send()参数设置为null

    通过 XMLHttpRequest对象提供的onreadystatechange事件监听服务器端的通信状态

    new XMLHttpRequest().onreadystatechange主要监听的属性是实例化对象中readyState(五个状态)

    0:open(未调用),1:send()未调用,2:send()已经调用,响应头和响应状态已经返回

    3:响应体正在下载,responseText(接收服务端响应的结果)获取到部分的数据

    4:整个请求过程已经完毕

    只要readyState属性值发生了改变,onreadyStatechange被触发

    接受并处理服务端向客户端响应的数据结果

    将处理结果更新到HTML页面中

const xhr = new XMLHttpRequest();

xhr.open('GET','http://localhost:3000/personalized?limit=10')

xhr.send(null)

xhr.onreadystatechange=function(){

if(xhr.readyState===4){

if(xhr.status>=200 && xhr.status<300){

//console.log(xhr.responseText)

let obj=JSON.parse(xhr.responseText)

console.log(obj);

obj.result.forEach(item => {

var div = document.createElement('div');

div.innerHTML=item.name

document.querySelector('body').appendChild(div)

});

}else if(xhr.status>=400){

console.log("错误信息"+xhr.status);

}

}

JS中如何封装一个ajax请求

请求方式,请求地址,请求参数,请求参数的类型

请求返回的结果

function ajax(options){

//创建XMLHttpRequest对象

const xhr=new XMLHttpRequest();

//初始化参数的内容

options = options || {}

options.type=(options.type || 'GET').toUpperCase()

options.dataType=options.dataType || 'json'

const params=options.data

//发送请求

if(options.type==='GET'){

//第三个参数async:布尔值,表示是否异步执行操作

xhr.open('GET',options.url+"?"+getParams(params),true)

xhr.send(null)

}else if(options.type==='POST'){

xhr.open('POST',options.url,true)

xhr.send(params)

}

//接收请求

xhr.onreadystatechange=function(){

if(xhr.readyState===4){

if(xhr.status>=200 && xhr.status<300){

//responseText 字符串形式的响应数据

//responseXML XML形式的响应数据

options.success(xhr.responseText,xhr.responseXML)

}else{

options.fail("参数错误"+status)

}

}

}

}

ajax({

type:'get',

dataType:"json",

data:{

limit:10,

},

url:'http://localhost:3000/personalized',

success:function(text,xml){

console.log(JSON.parse(text));

},

fail:function(status){//请求失败之后的回调函数

console.log(status);

}

})

function getParams(data){

let arr=[];

for(let key in data){

arr.push(${key}=${data[key]})

}

//console.log(arr);

return arr.join('&')

}

//getParams({limit:10,age:18})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise是JavaScript中的一种异步编程解决方案。它可以用来处理异步操作,并通过链式调用的方式,让代码更加清晰和易于理解。 Promise有三个状态:pending(进行中)、resolved(已完成)和rejected(已失败)。当Promise的状态发生变化时,会触发相应的回调函数。 Promise通过构造函数创建,并接收一个带有resolve和reject两个参数的函数作为参数。在这个函数中,我们可以执行异步操作,并通过调用resolve将操作结果传递给后续的回调函数,或者通过调用reject将操作失败的原因传递给后续的错误处理函数。 Promise提供了then方法,用于注册成功状态的回调函数,并返回一个新的Promise对象。这样可以实现链式调用,将多个异步操作有序地执行。 除了then方法,Promise还提供了其他一些方法,如catch方法用于注册错误状态的回调函数,finally方法用于注册不论成功或失败都会被执行的回调函数。 Promise还提供了一些静态方法,如Promise.all和Promise.race。Promise.all接收一个Promise对象组成的数组作为参数,当数组中所有的Promise对象状态都变成resolved时,才会调用then方法。而Promise.race方法则是只要数组中的一个Promise对象状态变成resolved或rejected时,就会调用then方法。 通过使用Promise,我们可以更加优雅地处理异步操作,并且可以避免回调地狱的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [从小知识点出发,彻底弄懂promise、async、await](https://blog.csdn.net/srj15110129498/article/details/127690288)[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: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值