zoukankan      html  css  js  c++  java
  • 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);
    })






     
  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/hongyafang/p/12421221.html
Copyright © 2011-2022 走看看