Promise的简单理解及使用
在使用异步编程时,我们会遇到回调地狱的问题,这时我们应该使用Promise。
什么是回调地狱,如下
//假如有三个异步的调用,他们的显示顺序是:点击运行,在一秒后全部显示出来
setTimeout(()=>{
console.log('上山')
},1000)
setTimeout(()=>{
console.log('上山打')
},1000)
setTimeout(()=>{
console.log('上山打老虎')
},1000)
//我们想让它依次经过一秒显示的话,需要改改,如,
setTimeout(()=>{
console.log('上山')
setTimeout(()=>{
console.log('上山打')
setTimeout(()=>{
console.log('上山打老虎')
},1000)
},1000)
},1000)
//这样就符合要求,但是代码一多,人会蒙掉,人称回调地狱,所以我们要使用promise
ECMAscript 6 原生提供了 Promise 对象。
Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。
什么是Promise
- Promise是一种异步编程的解决方案,其实是一个构造函数;
- 用于解决异步回调地狱的问题,简洁的API使得异步操作更加容易;
- 可以理解为是一个容器(对象),里面是异步事件。
Promise使用:
var p = new Promise(function(resolve,reject){
//成功会调用resolve
//失败会调用reject
});
p.then(function(ret){ //ret是resolve得到的结果,这里可以使用},
function(ret){ //ret是从reject得到的错误结果}
)
//使用箭头函数,可以写为
var p = new Promise((resolve,reject) => {
//成功会调用resolve
//失败会调用reject
});
p.then(ret => {//ret是resolve得到的结果,这里可以使用},
ret => {//ret是从reject得到的错误结果}
)
使用Promise处理开始的那个问题
new Promise((resolve,reject) => {
setTimeout(()=>{
console.log('上山');
resolve('上山');
},1000)
}).then(res => {
return Promise((resolve,reject) =>{ //注意,想要在下一个then中使用这个里面的结果,必须返回Promise
console.log(res + '打'); //也就是说,想要继续使用then,就得返回一个Promise对象
resolve(res + '打');
},1000)
}).then(res =>{
setTimeout(()=>{
console.log(res + '老虎');
},1000)
})