Promise
2018-12-30 本文已影响0人
我也不知道啊丶
回调
-
把一个函数A传给另一个函数B调用,那么A就是回调函数
一个最基本的具名回调
匿名回调
-
回调地狱
匿名回调嵌套过多层,导致代码难以理解
解决回调地狱的方法
1.给每一个匿名回调命名
2.Promise
Promise
.then(成功(),失败())
还是看上面的例子

再来看看另一个

Promise链

为什么会失败,因为在打印用户信息
的时候,resolve()
出去的是空信息
来修改一下

再开看看失败的情况

可以看到,虽然第一个
.then
走的是失败的方法,但是第二个.then()
还是走了成功的方法,这是因为如果在第一个.then()
的失败方法里没有抛出.reject()
,那么js会认为在第一个.then()
里已经处理好了失败的情况,然后接着运行下一个
可以把
打印失败信息
简写为
function 打印失败信息(info){
console.log('失败的理由是'+info)
return promise.reject('没有搞定') // 我没有搞定这个失败,请后面的回调不要
}
当第一个.then()
里的失败函数没有解决失败的时候,会默认由下一个.then()
里的失败函数去解决

Promise还提供了一些方法,如await、all、race
await
的意思是:等promise执行完
所以可以这样写
let 用户信息 = await 获取用户信息('王二狗');
console.log(用户信息)
['王二狗','元旦快乐']
但是如果await
后面的Promise
执行失败了,那么就会报错,所以 await 一般要和 try{}catch{}一起用

all
的意思是:等所有Promise执行完了再执行.then()
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise2 = new Promise(function(resolve,reject){
setTimeout(resolve,100,'foo')
});
Promise.all([promise1,promise2,promise3]).then(function(values){
console.log(values)
})
rece
的意思是:只要有一个Promise执行完就执行.then()
var promise1 = new Promise(function(resolve,reject){
setTimeout(resolve,550,'one')
});
var promise2 = new Promise(function(resolve,reject){
setTimeout(resolve,100,'two')
});
Promise.race([promise1,promise2]).then(function(values){
console.log(values)
})