ES6中的Promise.resolve()到底有何作用呢?

ts2015
  • 449

看了阮一峰的es6入门,对Promise.resolve()方法还有些疑惑,当给这个方法传入一个thenable对象作为参数时,到底发生了什么?又有何作用呢?

评论
阅读 28.1k
4 个回答

这是个语法糖吧

var foo = {
    then: (resolve, reject) => resolve('foo')
};
var resolved = Promise.resolve(foo);
相当于
var resolved = new Promise((resolve, reject) => {
    foo.then(resolve, reject)
});

resolved.then((str) => 
    console.log(str);//foo
)

@心不在焉 的答案是对的。

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() 来申明的,但是如何触发,以及应该触发成功还是失败呢?这就靠 resolvereject 这两个函数了,在 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()

宣传栏