看了阮一峰的es6入门,对Promise.resolve()方法还有些疑惑,当给这个方法传入一个thenable对象作为参数时,到底发生了什么?又有何作用呢?
看了阮一峰的es6入门,对Promise.resolve()方法还有些疑惑,当给这个方法传入一个thenable对象作为参数时,到底发生了什么?又有何作用呢?
@心不在焉 的答案是对的。
Promise.resolve
方法有下面三种形式:
Promise.resolve(value);
Promise.resolve(promise);
Promise.resolve(theanable);
这三种形式都会产生一个新的Promise。其中:
第一种形式提供了自定义Promise的值的能力,它与Promise.reject(reason)
对应。两者的不同,在于得到的Promise的状态不同。
第二种形式,提供了创建一个Promise的副本的能力。
第三种形式,是将一个类似Promise的对象转换成一个真正的Promise对象。它的一个重要作用是将一个其他实现的Promise对象封装成一个当前实现的Promise对象。例如你正在用bluebird,但是现在有一个Q的Promise,那么你可以通过此方法把Q的Promise变成一个bluebird的Promise。
实际上第二种形式可以归在第三种形式中。
Promise 的主要作用就是用于封装异步操作,以便根据异步操作是否成功来进行后续的操作。
后续操作是通过 then()
和 catch()
来申明的,但是如何触发,以及应该触发成功还是失败呢?这就靠 resolve
和 reject
这两个函数了,在 Promise 对象产生时,它们是为作封装的函数的参数的,如下
new Promise(function(resolve, reject) {
});
这里当然你也可以改成其它名字,反正是形参嘛。不过这两个名称已经是约定俗成,最好不要改。
简单的说,resolve 的时候,会调用以后 then 里面第1个参数指定的函数
先执行代码:
var test = {
then: (resolve,reject)=>{
console.log(1);
resolve(2)
}
}
var promise = Promise.resolve(test);
再执行代码:
var test = {
then: (resolve,reject)=>{
console.log(1);
resolve(2)
}
}
var promise = Promise.resolve(test);
promise.then((data)=>{
console.log(data);
})
可以看到第一段代码输出1,第二段代码输出1、2。所以:
1、Promise.resolve(thenable)会立即执行thenable对象里面的then方法
2、then方法里面的resolve和reject会作为参数传给Promise.resolve().then()
8 回答5.8k 阅读✓ 已解决
9 回答9.2k 阅读
6 回答4.7k 阅读✓ 已解决
5 回答3.5k 阅读✓ 已解决
3 回答10.3k 阅读✓ 已解决
4 回答7.9k 阅读✓ 已解决
7 回答9.8k 阅读
这是个语法糖吧