promise

用promise对函数封装:
原来的代码:

<!DOCTYPE html>
<html>
<head><title>vue demo</title><style type="text/css">body {font: 1.2em arial, helvetica, sans-serif;margin-top: 50px;margin-left:500px;color: #bb00ff;}</style>
</head>
<body>
<div id="app"><button id="btn">点击抽奖</button>
</div><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
function rand (m, n) {return Math.ceil(Math.random() * (n - m + 1)) + m - 1
}
const btn = document.querySelector('#btn')
// 绑定单击事件
btn.addEventListener('click', function () {// 定时器setTimeout(() => {//  /30%1-100123// 获取从1-100的一个随机数let n = rand(1, 100)//  判断if (n < 30) {alert('恭喜恭喜,奖品为10万RMB劳斯莱斯优惠券')} else { alert('再接再厉') }}, 1000)
}
)</script>
</body>
</html>


用promise进行封装:

 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script> Vue.config.productionTip = false</script>
<script type="text/javascript">
function rand (m, n) {return Math.ceil(Math.random() * (n - m + 1)) + m - 1
}
const btn = document.querySelector('#btn');
// 绑定单击事件
btn.addEventListener('click', function ()
{//promise实现const p = new Promise((resolve,reject) => {setTimeout(()=>{//promise可以包裹一个异步操作let n = rand(1, 100);if(n < 30){resolve();// resolve()可以将promise对象状态设置为成功} else{reject();},1000);});p.then(()=>{console.log('ok');
},()=>{console.log('fail');
alert('again');}
)
});</script>

用promise进行读取文件函数封装:

 mineReadfine (path) {return new Promise((resolve, reject) => {require('fs').readFile(path, (err, data) => {if (err) reject(err)resolve(data)})})}mineReadfine('name.txt').then({value=>{console.log(value.toString());
},reason=> {console.log(reason)
}
})

promise·fs模块

什么是fs模块 ==> File System

fs模块是Node.js的一个核心模块,专门用来操作系统中的文件,常用的操作方式是对文件的读取和写入使用require(‘fs’)载入fs模块,模块中所有方法都有同步和异步两种形式。异步方法中回调函数的第一个参数总是留给异常参数(exception),如果方法成功完成,该参数为null或undefined。异步写法demo:有一个回调函数。

fs.readFile(文件路径,options,回调函数)

异步的读取指定路径的文件,回调函数在读取文件完成后触发

readFileSync方法的第一个参数是文件路径,第二个参数可以是一个表示配置的对象,也可以是一个表示文本文件编码的字符串

const fs = require('fs');
fs.readFile('name.txt',(err,data)=>{if(err) throw err;console.log(data.toString());
});

promise封装Ajax请求


/
**
封装一个函数 sendAJAX发送 GET AJAX请求
*参数RL
*返回结果Promise对象
*/function sendAJAX(){return new Promise((resolve, reject)=>const xhr =  new xmlhttprequest();xhr.responseType ='json';xhr.open("GET", url);xhr.send();
∥处理结果
xhr. onreadystatechange= function(){if(xhr. readystate =4){∥/判断成功
if(xhr. status>=2e&&xhr.status<30e)
∥/成功的结果resolve(xhr. response);}else{reject(xhr. status);}}}}});}sendAJAX("https: api. apiopen. top/getok').then(value =>{console. log(value);} reason =>console.warn(reason);
});

. promise的状态改变和对象的值

实例对象中的一个属性PromiseState
pending未决定的
resolved 成功
rejected 失败

  1. pending变为 resolved
  2. pending变为 rejected
    说明:只有这2种,且一个 promise对象只能改变一次
    无论变为成功还是失败,都会有一个结果数据
    成功的结果数据一般称为 value,失败的结果数据一般称为 reason

实例对象中的另一个属性PromiseResult 保存着对象成功/失败的结果
通过resolve和reject函数可以改变

resolve reject方法

先看resolve:

<script type="text/javascript">
let p=Promise. resolve(521);
//如果传入的参数为非Promise类型的对象则返回的结果为成功 promise对象
//如果传入的参数为 Promise对象,则参数的结果决定了 resolve的结果
let p2 = Promise.resolve(new Promise((resolve,reject)=>{resolve('OK');
// reject('Error');
}))console. log(p2);p2.catch(reason=>{console. log(reason);
})
</script>


如果运行:
let p2 = Promise.resolve(new Promise((resolve,reject)=>{
reject(‘Error’);
}))


reject:(不管参数是什么返回的对象状态都是失败)

<script type="text/javascript">let p=Promise. reject(521);
console.log(p);</script>


.all方法:

let p1 = new Promise((resolve, reject)=>{resolve('OK');}
)let p2 =Promise.resolve('Success');let p3 =Promise.resolve('Oh Yeah');const result= Promise.all([p1,p2,p3]);console.log(result);

返回一个数组,且只有三个对象都为成功状态时数组才为成功状态

then方法的返回结果是一个promise对象

3.改变promise状态和指定调函数谁先谁后?
(1)都有可能,正常情况下是先指定调再改变状态,但也可以先改状态再指定回调
2如何先改状态再指定回调?
①在执行器中直接调用 resolve/reject
②延迟更长时间才调用then
(3)什么时候才能得到数据?
①如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据
如果先改变的状态,那当指定回调时,回调函数就会调用,得到数据
4. promise.then()返回的新 promise的结果状态由什么决定?
(1)简单表达:由then指定的回调函数执行的结果决定
(2)详细表达:
①如果抛出异常,新 promise变为 rejected, reason为抛出的异常
②如果返回的是 promise的任意值,新 promise变为 resolved value为返回的值
③如果返回的是另一个新 promise,此 promise的结果就会成为新 promise的结果
5. promise如何串连多个操作任务?
(1) promise的then返回一个新的 promise,可以开成then的链式调用
(2)通过then的链式调用串连多个同步/异步任务

回调函数

回调函数就是一个函数,它是在我们启动一个异步任务的时候就告诉它:等你完成了这个任务之后要干什么。这样一来主线程几乎不用关心异步任务的状态了,他自己会善始善终。

实例

function print() {document.getElementById("demo").innerHTML="RUNOOB!";
}
setTimeout(print, 3000);

这段程序中的 setTimeout 就是一个消耗时间较长(3 秒)的过程,它的第一个参数是个回调函数,第二个参数是毫秒数,这个函数执行之后会产生一个子线程,子线程会等待 3 秒,然后执行回调函数 “print”

回调函数的执行时间:状态改变的时候才会执行。
中断promise链的方法:用return new Promise(()=>{})
resolve reject 抛出异常 都会改变对象状态

ajax请求服务器(使用express框架)

先安装express:
清空缓存:npm cache clean -f

安装express: cnpm i express
新建ajax.js:

const express = require('express')
// eslint-disable-next-line no-unused-vars
// 创建应用对象
// eslint-disable-next-line no-unused-vars
const appp = express()
appp.get('/', (request, response) => {response.send('hello')
})
appp.listen(8081, () => {console.log('begin..')
})

终端输入:
node ajax.js
结果:


响应报文的内容:

标头:

模拟发送请求并得到服务器的数据:
新建html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>#result{margin-top: 100px;width: 200px;height: 100px;border: solid 1px #FFA722;}</style>
</head>
<body><button>发送请求</button><div id = "result"><br>
</div>
</body>
<script type="text/javascript">const btn = document.getElementsByTagName('button')[0]// 获取button元素btn.onclick = function () {// 创建对象const xhr = new XMLHttpRequest()// 初始化 设置请求方法和URLxhr.open('GET', 'http://localhost:8082/')xhr.send()// 事件绑定,处理服务端返回的结果xhr.onreadystatechange = function () {if (xhr.readyState === 4) {// 状态为4时才表示内容已经全部返回if (xhr.status >= 200 && xhr.status < 300) {console.log(xhr.status)// 状态码console.log(xhr.statusText)// 状态字符串console.log(xhr.getAllResponseHeaders())// 所有响应头console.log(xhr.response)// 响应体}}}}
</script>
</html>

ajax.js:

const express = require('express')
// eslint-disable-next-line no-unused-vars
// 创建应用对象
// eslint-disable-next-line no-unused-vars
const appp = express()
appp.get('/', (request, response) => {// 设置响应头,设置允许跨域response.setHeader('Access-Control-Allow-Origin','*')response.send('hello r353 i am ajax')
})
appp.listen(8082, () => {console.log('begin..')
})

request:是对请求报文的封装
response: 对响应报文的封装
注意:
response.setHeader(‘Access-Control-Allow-Origin’,’*’)这句话中的Access-Control-Allow-Origin不能换成其他东西,否则xhr状态码一直是0
加上:

const result = document.querySelector('#result')
result.innerHTML = xhr.response

再点击按钮:

控制台:

超时设置:
xhr.timeout=2000 两秒内如果还没有结果发送过来就取消请求
超时回调:
xhr.ontimeout = function(){
alert(‘网络异常,稍后重试’)
}

用axios发送ajax请求:

<button>GET</button>
<button>POST</button><button>AJAX</button>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>
<script type="text/javascript">const btns = document.getElementsByTagName('button')// 获取button元素btns[0].onclick = function () {axios.get('http://localhost:8083/server', {params: {id: 100,name: 'ds'}})}
</script>

promise的应用和在VUE中使用axios发送AJAX请求服务器相关推荐

  1. vue中使用axios发送ajax请求

    1 get请求: html代码: js代码: 2 post请求 3 综合方法 综合方法也可以传递参数的,分别和get请求和post请求传递的参数形式是一样的.... 一个简单的总结,后面再接着完善! ...

  2. Vue之axios发送Ajax请求

    2.10 axios发送ajax请求 axios github 2.10.1 准备工程 创建一个django工程,例如 login.创建完成之后,再创建一个子应用,例如users.最后再设置一下模板文 ...

  3. 六十五、vue生命周期和发送Ajax请求

    vue生命周期和发送Ajax请求 一 vue生命周期介绍 二 vue生命周期钩子函数 三 测试 三 发送Ajax请求 四 计算属性 五 监听属性 一 vue生命周期介绍 每个 Vue 实例在被创建时都 ...

  4. vue中使用axios跨域请求

    vue中使用axios请求API或其他域名地址时,会产生跨域请求问题,应该如何解决呢?(本文以请求API为例) 解决方法: 1.为axios设置请求头.拦截器等,这里直接对axios进行封装,将其封装 ...

  5. vue中使用axios发送请求(二)

    新建一个server文件夹,文件为MyHttp.js import axios from 'axios'; let MyHttp = {}; MyHttp.install = function (vu ...

  6. vue小项目总结与笔记【六】——使用axios发送ajax请求

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 安装: npm install axios --save 引入: import axios from ...

  7. Vue项目首页_使用axios发送ajax请求

    安装axios:  npm install axios --save 在Home.vue中发送一个ajax请求,然后把数据传递给子组件. 在Home.vue中: import axios from ' ...

  8. jquery发送ajax请求_复习之Vue用axios发送ajax请求

    Axios是一个基于promise的HTTP库. 浏览器支持情况:Chrome.Firefox.Safari.Opera.Edge.IE8+. 官网:https://github.com/axios/ ...

  9. 【vue】使用axios发送post请求实现excel下载

    1.实现效果: 2.实现代码: 1.前端代码: 1.1.响应拦截: // 导出 const headers = response.headers if (headers['content-type'] ...

最新文章

  1. NGUI的技能冷却实现
  2. hdu1808-Halloween treats(抽屉原理)
  3. 使用JAXB从XSD生成XML
  4. HDU 2222 Keywords Search
  5. 三星副会长李在镕启程赴美
  6. Redis主从复制、哨兵、Cluster安装部署
  7. BZOJ5262(容斥)
  8. 数据库, 数据仓库, 数据集市,数据湖,数据中台
  9. 为什么老实人很难当上领导?因为他们身上有这个致命弱点
  10. 百度信息流 绑定服务器,【实例】百度信息流账户搭建步骤
  11. Android开发之科大讯飞语音合成与播报
  12. 两台计算机怎样互相访问文件,两台电脑之间怎么互相传文件
  13. Matlab 自定义colormap
  14. 心无界,牧云端:华为云与人工智能的野望
  15. 【第二章 语言及文法】形式语言与自动机第二章个人总结复习笔记分享!(含文件、持续更新...)
  16. 大型传统企业如何向人工智能转型?
  17. zbb20181210 CentOS第一次安装MySQL的完整步骤
  18. oracle ebs版本查看,Oracle EBS R12 - 如何取得EBS某个文件的版本号
  19. 【C语言】用代码实现九九乘法口诀表
  20. JVM--类加载器详解

热门文章

  1. 智能机器人比巴和智伴哪个好_扫地机器人和吸尘器哪个好?
  2. 继承和多态的区别[发现记混了,区别下]
  3. oracle查看字典结构体,Oracle-17-数据字典查看约束信息
  4. 鸿蒙密视视频加密软件,鸿蒙密视视频加密软件
  5. matlab电力系统潮流计算,大神们,求个电力系统潮流计算的matlab程序。
  6. 搭建一个Struts2工程
  7. JavaWeb生成图片验证码
  8. 四十一、深入Java中的 File类
  9. WWW 2022 | 弯道超车:基于纯MLP架构的序列推荐模型
  10. 杭州内推 | 阿里云开发者社区招聘计算机视觉算法工程师(2022年毕业生)