Promise.resolve()与Promise
//Promise.resolve()和Promise.reject()常用来生成已经被决议为失败或者成功的promise案例
//Promise.reject()简单一些,不管传给它什么值,它决议为失败后就会直接把这个值传递过来
一、Promise.resolve
1.传递一个普通的值(比如字符串,数字等等)
let p1 = new Promise(resolve => { resolve('成功'); }) //和上面是等价的 let p2 = Promise.resolve('成功'); //会直接决议为成功并把这个值传递过去
2.传递一个promise实例
let cn = new Promise( resolve =>{ resolve('耶') }) //直接返回传递进去的promise let p = Promise.resolve(cn); //这里直接将cn实例返回给了p p.then(data => void console.log(data)) //后打印结果为耶 console.log( p === cn) //先打印true
3、
传递一个thenable对象(和类数组的概念有些相似)
//鸭子类型:一只鸡如果看起来像鸭子,那么它就是鸭子。在鸭子类型中,关注的不是对象的类型本身,而是他如何使用的。
//具有then方法的对象,看着像promise,那就把它转成promise,保留then
let obj = { //obj就是一个thenable对象 then(cb){ console.log('我被执行了'); //先打印'我被 执行了' cb('哼') }, oth(){ console.log('我被抛弃了') //不打印 } } //立即执行then方法 Promise.resolve(obj).then(data => { console.log(data) //打印出'哼' }) //总结:传进thenable对象时,会立即执行then方法,如果then方法中有回调,也会在thenable对象中被调用
二、Promise.reject
Promise.reject({ then() { console.log(1) } }) .then( () =>{ console.log('我不会被执行') }, e => { console.log(e) //不管在reject()中传递什么值,在这里拿到的就是什么值 })
三、
Promise在决议之后是异步去做他接下来要去做的事情
//打印结果按顺序为 123465
console.log(1); let pp = new Promise(resolve => { console.log(2); resolve(); console.log(3); }) console.log(4); p.then( () =>{ console.log(5); //异步是最后执行的 }) console.log(6) //总结:一般情况下,在当前这一轮的事件循环中,异步任务肯定是在同步任务之后执行的
四、把同步的任务转成异步任务
function createAsyncTask(syncTask){ return Promise.resolve(syncTask).then(syncTask => syncTask()) } createAsyncTask( () =>{ console.log('我变成了异步任务') //第二输出 return 1+1 }).then(res => { console.log(res); //最后输出 }) console.log('我是同步任务') //最先输出