thenable)创建Promise对象
第一参数空或者原始值,创建后的Promise对象状态直接为resolved状态
Promise.resolve('f')
// 等价于
new Promise(resolve => resolve('f'))
第二值得注意的是具有then方法的对象
let thenable = {
then :(resolve, reject) => resolve("thenable")
}
let p = Promise.resolve(thenable);
console.log(p);Promise对象状态由<pending>-><resolve>
第三参数为实例化的Promise对象,
let p1 = new Promise((resolve, reject) => false);
let p = Promise.resolve(p1);
console.log(p);p状态和p1状态一致的
Promise.reject(value)创建Promise对象
与resolve不同的是:直接将value原样作为参数传入
const thenable = {
then(resolve, reject) {
reject('出错了');
}
};
Promise.reject(thenable)
.catch(e => {
console.log(e === thenable)
})catch方法的参数不是reject抛出的“出错了”这个字符串,而是thenable对象。
Promise.all
将多个 Promise 实例,包装成一个新的 Promise 实例;const p = Promise.all([p1, p2, p3]);
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
会等all中的对象全部执行完后将数组传入回调函数then中
let p = new Promise((resolve, reject) => setTimeout(() => resolve('p'),1000));
let p1 = new Promise((resolve, reject) => setTimeout(() => resolve('p2'),2000));
let p2 = new Promise((resolve, reject) => setTimeout(() => resolve('p3'),3000));
Promise.all([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data)); // ["p", "p2", "p2"]let p = new Promise((resolve, reject) => resolve('p'));
let p1 = new Promise((resolve, reject) => reject('p2'));
let p2 = new Promise((resolve, reject) => resolve('p2'));
Promise.all([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data)); //p2Promise.race
与all不同的是:只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
let p = new Promise((resolve, reject) => setTimeout(() => resolve('p'),1000));
let p1 = new Promise((resolve, reject) => setTimeout(() => resolve('p2'),2000));
let p2 = new Promise((resolve, reject) => setTimeout(() => resolve('p3'),3000));
Promise.race([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data)); //pPromise对象的回调函数与setTimeout的顺序问题
An event loop has one or more task queues. A task queue is an ordered
list of tasks, which are algorithms that are responsible for such work
as: events, parsing, callbacks, using a resource, reacting to DOM
manipulation…Each event loop has a microtask queue. A microtask is a
task that is originally to be queued on the microtask queue rather than a
task queue.
浏览器(或宿主环境) 遵循队列先进先出原则, 依次遍历macrotask queue中的每一个task,
不过每执行一个macrotask, 并不是立即就执行下一个, 而是执行一遍microtask queue中的任务,
然后切换GUI线程重新渲染或垃圾回收等.
Event Loop (事件循环)拥有如下两种队列
macrotask queue, 指的是宏任务队列, 包括rendering, script(页面脚本), 鼠标, 键盘, 网络请求等事件触发, setTimeout, setInterval, setImmediate(node)等等.
microtask queue, 指的是微任务队列, 用于在浏览器重新渲染前执行, 包含Promise, process.nextTick(node), Object.observe, MutationObserver回调等.
process.nextTick > promise.then > setTimeout ? setImmediate
setTimeout(function () {
console.log('three');
}, 0);
Promise.resolve().then(function () {
console.log('two');
});
console.log('one');
// one
// two
// three上面代码中,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。
setTimeout(function() {
console.log(4)
}, 0);
new Promise(function(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以上就是ECMAScript6中Promise是什么?有什么用?(附示例)的详细内容,更多请关注php中文网其它相关文章!
网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。
关键词:ECMAScript6中Promise是啥?有啥用?(附示例)