Promise

2018-12-30  本文已影响0人  我也不知道啊丶

回调

解决回调地狱的方法

1.给每一个匿名回调命名
2.Promise

Promise

.then(成功(),失败())
还是看上面的例子

每次都要写 return new Promise(function(resolve,reject){})
再来看看另一个

Promise链


为什么这里获取好友信息失败了呢

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

在打印信息的时候把获取到的用户信息resolve出去
再开看看失败的情况

可以看到,虽然第一个.then走的是失败的方法,但是第二个.then()还是走了成功的方法,这是因为如果在第一个.then()的失败方法里没有抛出.reject(),那么js会认为在第一个.then()里已经处理好了失败的情况,然后接着运行下一个

可以把打印失败信息简写为
function 打印失败信息(info){
    console.log('失败的理由是'+info)
    return promise.reject('没有搞定') // 我没有搞定这个失败,请后面的回调不要
}

当第一个.then()里的失败函数没有解决失败的时候,会默认由下一个.then()里的失败函数去解决

前面打印失败信息中的reject写错了 :)

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)
})
上一篇 下一篇

猜你喜欢

热点阅读