Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。下面代码创造了一个Promise实例。
new Promise(function(resolve,reject){
console.log('Promise');
resolve();
}).then(function(){
console.log('resolved.');
})
console.log('Hi!');
// Promise
// Hi!
// resolved
错误捕获
promise.then(function(data) {
// 成功时执行的代码块
}, function(err) {
// 失败时执行的代码块
});
// 等同于
promise.then(function(data) { //cb
// 成功时执行的代码块
}).catch(function(err) {
// 失败时执行的代码块
});
其他promise方法
promise.all()【返回一个 Promise
实例,此实例在 iterable
参数内所有的 promise
都“完成(resolved)”或参数中不包含 promise
时回调完成(resolve);如果参数中 promise
有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise
的结果
】
Promise.all([p1,p2,p3]).then(res=>{
console.log(res)
})
promise.race()【返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。】
var promise1 = new Promise(function(resolve, reject) {
setTimeout(resolve, 500, 'one');
});
var promise2 = new Promise(function(resolve, reject) {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then(function(value) {
console.log(value);
});
// two
async/awite
ES2017 (ES7)标准引入了 async 函数,使得异步操作变得更加方便。async 函数是什么?一句话,它就是 Generator 函数的语法糖。使异步代码变成同步执行。
基本用法
async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
上面代码指定 50 毫秒以后,输出hello world。
返回Promise对象
async function f() {
return 'hello world';
}
f().then(v => console.log(v))
// "hello world"
注意点:
async函数和普通函数一样按顺序执行,同时,在执行到await语句时,返回一个Promise对象
await可以理解为将async函数挂起,直到等待的Promise被fulfill或者reject,再继续执行之后的代码
async函数的返回值和普通Promise没有区别