var promise = new Promise(function(resolve, reject) { resolve('ok'); throw new Error('test'); }); promise .then(function(value) { console.log(value) }) .catch(function(error) { console.log(error) }); // ok
7 Promise.all()
参数为Promise 对象的数组;将多个Promisre 对象包装成一个新的Promise 对象,如果数组中不是Promise 对象,就会自动调用 Promise.resolve方法,将参数转为Promise实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例)
var p = Promise.all(promises).then(function (posts) { // ... }).catch(function(reason){ // ... });
① 只要promises之中有一个状态变为rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
② 如果全部都变为resolved;此时 promises 数组中所有对象的返回值组成一个数组,传递给p的回调函数。
8 Promise.resolve()
将现有对象转为 Promise对象,Promise.resolve方法就起到这个作用。
Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))
① 参数为Priomise 对象,Promise.resolve() 不做任何处理。
② 参数是一个具有 then 方法的对象:Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thenable对象的then方法。
let thenable = { then: function(resolve, reject) { resolve(42); } }; let p1 = Promise.resolve(thenable);//p1为一个状态已经是resolved 的promise对象. p1.then(function(value) { console.log(value); // 42 });
③ 参数不是具有then方法的对象,或根本就不是对象
该参数变为生成的 Promise 对象的 resolve() 的参数。
var p = Promise.resolve('Hello');//Hello 会传递给 p 的resolve() p.then(function (s){ console.log(s) }); // Hello