当p1、p2、p3的状态全部为resolved时,才能将p的状态改为resolved
当p1、p2、p3其中一个状态变成rejected时,就会将p的状态变成rejected
Promise.all用的最多一般是我们在请求网络数据时,比如需要同时请求多个接口,我们可以合并多个请求一次处理
function getURL(URL) { return new Promise(function (resolve, reject) { var req = new XMLHttpRequest(); req.open('GET', URL, true); req.onload = function () { if (req.status === 200) { resolve(req.responseText); } else { reject(new Error(req.statusText)); } }; req.onerror = function () { reject(new Error(req.statusText)); }; req.send(); }); } function getComment() { return getURL('http://azu.github.io/promises-book/json/comment.json').then(res=>JSON.parse(res)); } function getPeople() { return getURL('http://azu.github.io/promises-book/json/people.json').then(res=>JSON.parse(res)); } // 合并请求 Promise.all([getComment(), getPeople()]).then(function (value) { console.log(value); }).catch(function(error){ console.log(error); }); Promise resolve和rejectPromise.resolve() 与 Promise.reject()
Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo')) 最后记得以前在面试的时候,被问了一道很有意思的面试题,主要是考察promise和settimeout执行顺序
setTimeout(function () { console.log(1) }, 0); new Promise(function executor(resolve) { resolve(); }).then(function () { console.log(2); });如上代码,为什么运行结果是2,1而不是1,2?
不是setTimeout先加入任务队列吗?
解答:
1、从规范上来讲,setTimeout有一个4ms的最短时间,也就是说不管你设定多少,反正最少都要间隔4ms才运行里面的回调(当然,浏览器有没有遵守这个规范是另外一回事儿)。而Promise的异步没有这个问题。
2、从具体实现上来说,这俩的异步队列不一样,Promise所在的那个异步队列优先级要高一些。
还有一道差不多的
(function test() { setTimeout(function() {console.log(4)}, 0); new Promise(function executor(resolve) { console.log(1); for( var i=0 ; i<10000 ; i++ ) { i == 9999 && resolve(); } console.log(2); }).then(function() { console.log(5); }); console.log(3); })()为什么输出结果是 1,2,3,5,4 而非 1,2,3,4,5 ?
解答:
1、Promise.then 是异步执行的,而创建Promise实例( executor )是同步执行的。
2、setTimeout 的异步和 Promise.then 的异步不太一样不在同一个队列中,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.then()在本轮“事件循环”结束时执行。因此then 函数先输出,settimeout后输出。