he-maoke

导航

day27promise和jsonp

Ajax回顾:

核心对象:xmlhttprequset

步骤

1.创建对象

2.打开请求地址(设置请求方式GET和POST)

3.发送监听请求

5.在请求监听中获取数据

回调地狱

回调函数的无线嵌套 导致代码可读性和维护性差(代码失去了价值0

//需求 从a接口里面查询 用户名是李四的id
//从b接口查询对应的id的商品
//从c接口查询对应的商品的ip的商品类型
// 伪代码
AjaxUtil.get('a',{username:'李四'},(res)=>{ //a接口通过传姓名 获取返回的id
AjaxUtil.get('b',{id:res.data.id},(res)=>{ //通过a接口返回的id 来获取对应的商品
AjaxUtil.get('c',{id:res.data.id},(res)=>{ //通过b接口返回的商品id 来获取对应
的商品类型
console.log(res.data);
....
})
})
})

解决回调地狱

使用es6新增的promise对象

Promise对象

概述:

promise是es6新增的一个对象,他翻译为状态.promise设计为异步的

 

 

 等待状态(不能做其他事的事情)

成功状态(有成功调用的方法)

失败的状态(有失败的方法)

示例

// 使用new关键词 里面传递的参数是一个方法 这个方法里面通常存储一些异步的操作
// resolve表示成功执行的方法 reject失败执行的方法
var promise = new Promise((resolve,reject)=>{
let timer = setTimeout(()=>{
console.log('hello');
//调用成功的方法 里面可以传参数
// resolve('成功')
reject('失败')
},2000)
})

then (resolve进入的方法)

//对应的promise对象有俩个方法 then 成功调用的方法 catch 失败调用的方法
//.then 在对应的resolve方法调用以后 .catch reject调用才能进入
promise.then((res)=>{
//在then里面的方法 里面的参数为resolve的传递的参数
console.log(res);
console.log('我执行完了');
})

catch(reject进入的方法)

promise.catch((err)=>{
//在catch里面的方法 里面的参数为reject的传递的参数
console.log(err);
})

finally(只要达到成功或者是失败调用的方法)

//不管成功还是失败都会调用的方法(没有值传递)
promise.finally(()=>{
console.log();
})

then catch finally 都是原型方法 Promise.prototype上面的方法

对象方法

Promise.reject() //返回的是一个promise对象(then获取的参数)

Promise.resolve()//返回的是一个promise对象(cacth获取的参数)

Promise.all(promise数组)//返回的一个promise数组(并行 包含执行完成的)

Promise.race(promise数组)//返回的一个promise对象(返回的是最先执的promise)

//对象方法
Promise.reject('失败').catch((res)=>{
console.log(res);
}) //失败
Promise.resolve('成功').then((res)=>{
console.log(res);
}) //成功
var arr = Promise.all([promise1,promise2,promise3]) //当所有的执行完才返回结果(数组)
var promise4 = Promise.race([promise1,promise2,promise3]) //race竞速 谁先执行完就是

利用promise来解决回调地狱

 

 

 1.通过在对应的.then方法返回一个新的promise对象的形式

//解决回调地狱的方案
promise1.then((res)=>{
console.log(res);
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('jack');
resolve('jack的promise')
},1000)
})
}).then((res)=>{
console.log(res);
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('吃饭了吗');
resolve('吃饭了的promise')
},1000)
})
}).then((res)=>{
console.log(res);
setTimeout(()=>{
console.log('你好');
},1000)
})

ES7新增async(异步)await(等待)

1.async修饰方法 await修饰对应的promise对象

2.await只能在async里面使用(他是来修饰promise对象的)

3.await会让当前主线程等待(上锁)当你执行完成(成功了或者失败了)才放行(解锁)

//使用es7的 async以及await来简化代码
window.onload = async ()=>{
await new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('hello');
resolve()
},1100)
})
await new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('您好');
resolve()
})
})
console.log('执行完了');
}

 

 

 

 

同源策略

概述:同源策略是netspac提出的一种安全策略,他是为了防止对应的后台被无限的访问(导致对应的安全问题).他是域名相同(IP地址)端口号相同 协议相同.

同源导致的问题(跨域CORS)

1.协议不同

2.端口号不同

3.ip地址不同

4.在ftp请求 资源也不同也会跨域

 

 

 解决跨域问题

1.后台解决(通过设置相应头)

Access-Control-All-Origin:*//所有都可以访问

Access-Control-All-Origin-Method:*//所有请求请求都可以访问

2.前台解决(通过对应的请求来设置对应的后台的响应)

3.前台解决(通过jsonp来解决跨域后台的配合)

4.代理(我将对应你的访问作为我对应的服务器的代理)

跨域的根本问题是因为http协议(不走http协议websocket(tcp协议))

JSONP

jsonp是一种解决跨域的方式,他需要后台的配合,对应的jsonp的核心是利用了对应html中带链接的标签特性(link script iframs,不受跨域影响的特性来解决问题)这个里面的js代码不是浏览器本身在操作的而是后台通过服务器来操作渲染的

 

 原理:利用script标签 链接这个地址 再将我们回调函数作为参数传入

缺点:只支持get请求(根本上就是get请求)

json入门案例(百度搜索)

今日问题

安装node.js node安装成功 在cmd中node -v成功显示版本号,但是npm -v报错

 

 解决办法:

在系统环境变量的用户变量的path 设置node.js中的node_global的路径

posted on 2022-06-26 16:16  hmkyj  阅读(25)  评论(0编辑  收藏  举报