ES6学习笔记之promise

首先要来认识,什么是promise

官方:所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

 

听起来云里雾里,我们还是先来认识下同步是什么吧。

同步就是一次只能执行一个任务,包括函数调用以后,执行结束,返回执行结果才能进行下一个任务。假如这个任务执行时间很长,例如死循环,那就一直没法结束这个执行,那就要等好久好久好久或者永久,这就是线程阻塞。

所以为了避免阻塞,就需要异步。

异步就是同时执行多个任务,函数回调后不会立即返回执行结果,如果A任务需要等待,那就先执行B,等到A执行完了就继续执行A,特别是在层层嵌套请求的时候,单用ajax的话就要一直嵌套,会变得很复杂,如果我们使用promise,就可以结合then来改写,那代码就会变得非常简洁易懂。

改写之前:

request('test1.html', '', function(data1) {
    console.log('第一次请求成功, 这是返回的数据:', data1);
    request('test2.html', data1, function (data2) {
        console.log('第二次请求成功, 这是返回的数据:', data2);
        request('test3.html', data2, function (data3) {
            console.log('第三次请求成功, 这是返回的数据:', data3);
            //request... 继续请求
        }, function(error3) {
            console.log('第三次请求失败, 这是失败信息:', error3);
        });
    }, function(error2) {
        console.log('第二次请求失败, 这是失败信息:', error2);
    });
}, function(error1) {
    console.log('第一次请求失败, 这是失败信息:', error1);
});

改写以后:
sendRequest('test1.html', '').then(function(data1) {
    console.log('第一次请求成功, 这是返回的数据:', data1);
    return sendRequest('test2.html', data1);
}).then(function(data2) {
    console.log('第二次请求成功, 这是返回的数据:', data2);
    return sendRequest('test3.html', data2);
}).then(function(data3) {
    console.log('第三次请求成功, 这是返回的数据:', data3);
}).catch(function(error) {
    //用catch捕捉前面的错误
    console.log('sorry, 请求失败了, 这是失败信息:', error);
});

注意:Promise一旦新建就会「立即执行」,无法取消。这也是它的缺点之一。

再举个简单的栗子:
let a = 1;
let p1 = new promise(function(resolve,reject){
  if(a == 1){
    resolve("成功啦!");
  }else{
    reject("失败啦!");
  }
})

p1.then(res=>{
  console.log(res);
},err=>{
  console.log(err);
})






 
posted @ 2020-03-07 21:49  hongyafang02  阅读(153)  评论(0编辑  收藏  举报