1:ES6 规定,Promise
对象是一个构造函数,用来生成Promise
实例。
console.log('World!');
let promise = new Promise(function(resove, reject) {
console.log('promise');
resove();
});
promise.then(() => {
console.log('resolved.');
}).catch((err) => {
console.log("error");
})
console.log('Hi!');
在不设置回调函数的情况下,控制台输出:
World!
promise
Hi!
在设置回调函数的情况下,控制台输出:
World!
promise
Hi!
resolved.
注意:
// Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消
// 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
//立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务
/Promise.all(iterable) 方法返回一个 Promise 实例
//如果所有传入的 promise 都变为完成状态,或者传入的可迭代对象内没有 promise,Promise.all 返回的 promise 异步地变为完成
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 4);
});
Promise.all([p1, p2, p3]).then(values => {
// let [p1, p2, p3] = values;
// console.log(p1);
// console.log(p2);
// console.log(p3);
values = values.map((item) => Number(item) + 1)
console.log(values); // [3, 1337, "foo"]
});
2:async
函数返回一个 Promise 对象
async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误
也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数
console.log("11");
async function f() {
console.log("我先执行了");
// 等同于
// return 123;
return await 123;
}
f().then(v => console.log(v))
console.log("最后执行吗?")
在不设置回调函数的情况下,控制台输出:
11
最后执行吗?
在设置回调函数的情况下,控制台输出:
11
我先执行了
最后执行吗?
123
总结:promise对象一旦建立立即执行,不管有没有设置回调函数都会进行,async等到await后面异步对象全部执行完成才会调用回调函数