Promise基本使用是怎样,then方法和catch方法怎么用
Admin 2022-06-28 群英技术资讯 1000 次浏览
很多朋友都对“Promise基本使用是怎样,then方法和catch方法怎么用”的内容比较感兴趣,对此小编整理了相关的知识分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获,那么感兴趣的朋友就继续往下看吧!Promise是ES6引入的异步编程的新解决方案。语法止Promise是-一个构造函数,
用来封装异步操作并可以获取其成功或失败的结果。
实例化Promise
new Promise()
在实例化的时候接受一个参数, 这个参数是一个函数。
这个函数有两个形参,resolve 和 reject
var promise = new Promise((resolve,reject) => {
// 里面用于处理异步操作
})
我们在这里使用定时器来模拟异步操作
promise有三种状态,分别是:进行中、成功、失败。
var promise = new Promise((resolve,reject) => {
// 这是一个异步操作
setTimeout(() => {
// 这里模拟获取数据
var data = '获取的数据'
// 在得到数据之后我们可以调用resolve和reject方法来改变promise对象的状态
resolve(data) // resolve可以将promise对象的状态改为成功,reject()可以promise将对象状态改为失败
}, 1000);
})
当promise对象的状态为成功或者失败时可以调用then方法
then方法接受两个参数,而且两个参数都是函数类型的值
promise对象的状态为成功时,会调用then方法的第一个参数
也是就说promise对象的状态为失败时,会调用then方法的第二个参数
第二个参数时可选的,如果不需要捕获失败可以省略
参数分别有一个形参,成功的函数叫value, 失败的err
promise.then(value => {
// 当异步函数里面调用了resolve(data),也是就说promise对象的状态为成功时,会调用then方法的第一个参数
console.log(value); // 'hello world' value就是resolve()方法传递过来的数据
}, err => {
// 当异步函数里面调用了reject(data),也是就说promise对象的状态为失败时,会调用then方法的第二个参数
console.log(err); // err就是reject()方法传递过来的数据
})
调用then方法then方法的返回结果是Promise 对象,对象状态由回调函数的执行结果决定
如果回调函数中返回的结果是非promise类型的属性,状态为成功,返回值为对象的成功的值
let data = promise.then((val) => {
// console.log(val.result);
// 返回非Promise的情况
// return val.result
// 返回Promise的情况
return new Promise( (resolve, reject) => {
// resolve('ok')
reject('err')
})
}, err => {
console.log(err);
})
// 返回非Promise的情况 状态为成功,返回值为对象的成功的值
// 返回结果是Promise 对象,对象状态由回调函数的执行结果决定
// 抛出错误,状态为失败
console.log(data);
所以then可以链式调用使用方法可参见下面promise应用示例。
promise的catch方法是then(null, rejection)的别名,用于指定发生错误时的回调
Promise对象的状态为resolve,就会调用then方法的指定回调函数
const promise = new Promise((resolve, reject) => {
resolve('ok')
})
promise.then(val => {
console.log(val); // ok
}).catch(err => {
console.log(err);
})
如果promise的状态为rejected就会调用catch方法的回调函数来处理这个问题。
const promise = new Promise((resolve, reject) => {
reject('err')
})
promise.then(val => {
console.log(val);
}).catch(err => {
console.log(err); // err
})
如果then方法在运行中出现错误也会被catch方法捕获
const promise = new Promise((resolve, reject) => {
resolve('err')
})
promise.then(val => {
console.log('ok'); // ok
throw '出错了!!' // then里面抛出的错误会继续被catch捕获
}).catch(err => {
console.log(err); // 出错了!!
})
promise对象的错误具有冒泡的性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch捕获。
const promise = new Promise((resolve, reject) => {
resolve('ok')
})
promise.then(val => {
return new Promise((resolve, reject) => {
reject('err')
})
})
.then(val => {
return new Promise((resolve, reject) => {
reject('err')
})
})
.catch(err => {
// 以上产生的错误都可以被catch捕获到
console.log(err); // err
})
一般来说,不要在then方法中定义rejected状态回调函数(即then的第二个参数),而应总是使用catch方法。
promise读取文件,多个文件连续调用
在这个例子中我们用到了Node.js的文件模块
// 读取文件信息
const fs = require('fs')
在下面代码中我们使用了promise包装了异步函数
我们先来看看正常的文件读取操作
// 读取文件信息
const fs = require('fs')
// 如果读取失败err就是一个错误对象,读取成功data就是数据
fs.readFile('./01.txt', (err, data) => {
// 判断是否出现错误,如果读取错误就打印错误对象。
if (err) {
console.log(err);
return
}
console.log(data.toString());
})
我们如果想在读取成功之后继续读取文件,就需要在回调函数中继续使用fs.readFile...去读取文件,嵌套层次一多,这样一来就会形成回调地狱。
接下来我们使用Promise的方式来读取文件
// 读取文件信息
const fs = require('fs')
const promise = new Promise((resolve, reject) => {
fs.readFile('./01.txt', (err, data) => {
if (err) return reject(err)
resolve(data)
})
})
promise.then(val => {
console.log(val.toString());
// 返回一个Promise对象
return new Promise((resolve, reject) => {
fs.readFile('./02.txt', (err, data) => {
if (err) return reject(err)
resolve(data)
})
})
}, err => {
console.log(err);
})
// 上一个then里面返回的是一个promise对象,我们可以继续.then
.then(val => {
console.log(val.toString());
return new Promise((resolve, reject) => {
fs.readFile('./03.txt', (err, data) => {
if (err) return reject(err)
resolve(data)
})
})
}, err => {
console.log(err);
})
.then(val => {
console.log(val.toString());
}, err => {
console.log(err);
})
promise封装ajax请求
封装了ajax请求,使用then获取结果,让代码看起来更加简洁,解决了回调地狱的问题
const promise = new Promise((resolve, reject) => {
// 创建对象
const xhr = new XMLHttpRequest()
// 初始化
xhr.open("GET", 'https://api.apiopen.top/getSongPoetry?page=1&count=20')
// 发送
xhr.send()
// 绑定事件处理响应结果
xhr.onreadystatechange = function () {
// 判断
// 进入最后一个阶段,所有的响应体都回来了
if (xhr.readyState === 4) {
// 判断响应码
if (xhr.status >= 200 && xhr.status < 300) {
// 表示成功
// console.log(JSON.parse(xhr.response));
resolve(JSON.parse(xhr.response))
} else {
reject(xhr.status)
}
}
}
})
// 指定回调
promise.then((val) => {
console.log(val);
}, err => {
console.log(err);
})
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
我们经常能在一些网站页面上看到圆圈序号列表,也就是带圆圈的需要,这样的序号列表能增加网页的美观性,那么圆圈序号列表怎样用js实现呢?下面就给大家分享一个JS实现彩色圆圈序号列表的实例。
一般在纯前端静态页面的项目中,是不需要JS调命令行操作的,通常在Node项目,或者在Electron客户端项目中,可能会有这样的需求。(electron这个客户端框架本身就内置了node的很多方法)。因此下文针对的是有node层的项目如何执行shell。
父子组件之间的通信就是props down,events up,父组件通过属性props向下传递数据给子组件,子组件通过事件events 给父组件发送消息,这篇文章主要给大家介绍了关于vue中组件的props属性的相关资料,需要的朋友可以参考下
接到需求需要一个服务来执行shell脚本,要求可以实时打印shell脚本执行的过程,并看到脚本执行的结果。明确任务目标:这是一个web服务,需要执行shell脚本当一个脚本执行的时候,再次发送请求需要等待当前脚本执行完毕,再自动执行这次请求使用长连接而不是socket添加脚本不需要重启服务器这里采用的是express框架开始首先搭好express基本框架新建
vue项目或网页上实现文字转换成语音播放功能,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008