它是一个ES6提出一个新语法,用来优化异步代码的写法。
promise:承诺
对将来要发生的事情的肯定
。 例如 : 高中生说,老师,我会考上一所好大学的;销售员说,老板,我一定会签下大单的;程序员说,老妈,我过年一定会带个女朋友回来的。学习内容
回调地狱问题
后台接口
// 静态资源托管,直接访问public/api.html const express = require('express') const app = express() var cors = require('cors') // 处理跨域请求 app.use(cors()) app.use( express.static('public') ) // 接口1:获取所有的频道 app.get('/get', (req, res) => { res.send([{id:1, name:'体育频道'}, {id:2, name:'娱乐频道'}]) }) // 接口2:获取指定频道下的分类 app.get('/getCategory', (req, res) => { if(req.query.id==1){ // 体育频道 res.send([{id:12, name:'NBA新闻'}, {id:13, name:'足球新闻'}]) }else { res.send([{id:10, name:'娱乐天天笑'}]) } }) // 接口3:获取指定新闻列表 app.get('/getNews', (req, res) => { if(req.query.id==12){ // NBA新闻 res.send([{id:1, name:'谁能得到今年的总冠军'}, {id:2, name:'湖人已经不行了么?'}]) }else { res.send([]) } }) app.listen(3000)
前台代码
Document
Promise是承诺的意思,es6中提出一个新api。
用来优化异步代码。它的经典使用方式如下
var p1 = new Promise(function(resolve,reject){ //异步操作 resolve(obj1) 或者 reject(obj2) }); p1.then(function(rs){ // 如果p1的状态是resolved,则then中的函数 //会执行,且obj1的值会传给rs }).catch(function(rs){ // 如果p1的状态是reject,则catch中的函数 // 会执行,且obj2的值会传给rs }).finally(function(){ // 一定会执行的函数 })
// const obj = new Object() // const arr = new Array() const p1 = new Promise(function(resolve,reject){ // 执行异步代码 // 调用resolve,或者reject }); console.dir(p1)
要点:
new Promise()
报错的信息是: Promise resolver undefined is not a function
var p1 = new Promise((resolve,reject)=>{})
。一个Promise对象的状态可能是如下三种之一:pending
,resolved
,rejected
。下面分别介绍。
初始态pending
pending。它的意思是 "待定的,将发生的",相当于是一个初始状态。 创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。
var p = new Promise((resolve,rejectok,err)=>{ console.info('发呆.....' )}) console.dir(p)
这个初始状态就是你对别人说出承诺的那个瞬间,此时,大家都不知道这个承诺是否能兑现。
成功态resolved
也有叫fulfilled的。
resolved。表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法(即第一个参数)。
var p = new Promise((resolve,reject)=>{ resolved();}) console.dir(p)
注意,上面的resolve和reject仅是形参名而已。
失败态rejected
rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。
var p = new Promise((resolve,reject)=>{ reject()} ) console.dir(p)
三种状态小结
最初创建promise对象时,默认状态是pending,如果在函数体内部调用了第一个参数对应的函数,则状态变成了resolved;如果调用了第二个参数对应的函数,则状态变成了rejected。
pending ----- resolve() --> resolved; pending ----- reject() --> rejected;
一旦从pending ---> resolved(或者是rejected),就不可能再回到pending,也不能由resolved变成rejected。
promise的值
一个promise对象除了状态之外,还有promiseValue。在构造器中,这个值在调用resolve和reject方法时传入。
例如:
var p = new Promise( (resolve,reject) => { resolve(123); } ); // 此时,prommise对象p的状态是 resolved,值是123。 console.dir(p)
在构造器的函数体中,一旦状态发生了变化,就会进行then,或者是catch中去,同时把promiseValue传入对应的函数。
具体来说:
根据实际情况的需要,也可以不加上finally()。