从零开始学_JavaScript_系列(51)——Promise(4)Promise.resolve和Promise.reject
2017-07-28 10:11
477 查看
9、Promise.resolve
Promise.resolve(value);Promise.resolve(promise);
Promise.resolve(thenable);
参数与返回值:
参数是promise对象:返回值是参数,不做任何改变;
参数是thenable:指是一个有then属性的对象,返回值是一个新建的Promise对象,相当于将then方法作为创建时的参数使用;
参数是value:指不是以上两种情况,比如是一个字符串或者普通对象,返回一个状态是resolved的Promise对象,值是value
为了方便理解,
Promise.resolve相当于以下代码:
function resolve(data) { // 当参数是Promise对象时 if (Object.prototype.toString.call(data) === '[object Promise]') { return data; } // 当参数不是thenable时 if (typeof data !== 'object' || typeof data.then !== 'function') { return new Promise(res => { res(data) }) } // 当参数是thenable时 return new Promise(data.then.bind(data)) }
情况一:参数是Promise对象
直接返回该Promise对象,不做任何操作
let foo = new Promise(res => res('foo')); let bar = Promise.resolve(foo); foo === bar; //true let baz = resolve(foo); foo === baz; //true
情况三:参数是value
let bar = new Promise(res => res("bar")) bar.then(msg => console.log(msg)) let foo = Promise.resolve('foo') foo.then(msg => console.log(msg)) let res = resolve('res') res.then(msg => console.log(msg)) let baz = new Promise(res => res("baz")) baz.then(msg => console.log(msg)) // bar // foo // res // baz
情况二:参数是thenable
这个情况看起来,但细节比较多,理解起来会有点费劲。
首先,对象的then方法被作为一个新的Promise对象的参数使用;
其次,该方法的this被默认指向了对象本身。
如果在resolve里不将this通过bind绑定给data的话,那么在执行的时候,this会指向window。原因是new Promise的时候,会改变新建对象的this指向目标,而Promise对象的this指向的是window
第三,如果在then方法里,状态改变之前抛错,那么会触发reject回调函数,而不是resolve。原因跟new Promise的参数里抛错会执行reject是一个道理
第四,假如在then方法中,最终执行了第二个参数reject,而不是resolve,那么最终状态也会变为rejected。
示例代码:
let foo = { then(res, rej){ res('123') } } Promise.resolve(foo).then(msg => console.log(msg)) resolve(foo).then(msg => console.log(msg)) // 123 // 123
Promise.reject
跟Promise.resolve没啥区别,除了在非thenable情况下,状态会默认变为rejected之外。
所以参考上面的Promise.reject即可。
相关文章推荐
- [javascript高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
- 从零开始学_JavaScript_系列(49)——Promise(2)then、值、catch
- 从零开始学_JavaScript_系列(50)——Promise(3)全部完成all和看谁最快race
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
- 从零开始学_JavaScript_系列(48)——Promise(1)基础知识
- 从零开始学_JavaScript_系列(12)——jquery<2>(高度自适应,哈希地址及检测,单页面技术)
- 从零开始学_JavaScript_系列(61)——class(2)私有方法、this
- 从零开始学_JavaScript_系列(15)——js系列<3>(转为字符串,截取字符串)
- 浅谈promise(then、catch、resolve、reject、race、all、done、finally)
- 从零开始学_JavaScript_系列(八)——js系列<2>(事件触发顺序、文本读取、js编写ajax、输入验证、下拉菜单)
- 从零开始学_JavaScript_系列(36)——base64字符串与图片的相互转换
- 从零开始学_JavaScript_系列(47)——Reflect
- 从零开始学_JavaScript_系列(62)——class(3)setter和getter、Generator、async函数
- 从零开始学_JavaScript_系列(五)——dojo(基础,动画移动,重力模拟,动画合并,添加标签)
- 深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
- 从零开始学_JavaScript_系列(55)——Generator函数(3)yield*表达式
- 从零开始学_JavaScript_系列(24)——查看对象属性,合并数组
- 从零开始学_JavaScript_系列(40)——对象的扩展(3)当枚举、原型链遇见对属性的操作
- 从零开始学_JavaScript_系列(16)——CSS<3>(文本、对齐、圆角、盒模型、背景)
- 从零开始学_JavaScript_系列(67)——es6的import和export(chrome61版本后可用)