前言

Promise是ES6引入一个新的语法专门用于异步编程

一、JS中的异步编程

js中,异步编程三种

1、 定时任务

setInterval(() => {
 // ...
}, interval);
setTimeout(() => {
	// ...
}, timeout);

2、ajax

$.ajax({
    url,
    data,
    success:function (result){
    	alert(result)
    }
})

3、 事件回调函数

 //定义函数回调函数作为参数
function A(callback) {
    callback();
    console.log('我是主函数');
}

//定义回调函数
function B() {
    setTimeout("console.log('我是回调函数')",2000);//即使此时时间设置为0,也会先输出函数
}

//调用函数,将B传进去
A(B);

多次异步调用依赖分析

多次异步调用结果顺序不确定
② 异步调用结果如果存在依赖必须使用嵌套

二、Promise

1、概念

Promise是异步编程的一种解决方案,从语法上讲,Promise一个对象,它可以获取异步操作消息

官方:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

2、优点

可以避免多层异步调用嵌套问题回调函数
② Promise 对象提供了简洁的API,使得控制异步操作更加容易

3、基本用法

实例化Promise对象构造函数中传递函数,该函数中用于处理异步任务

new Promise(function(resolve, reject){ })

resolvereject两个参数用于处理成功和失败两种情况

4、基本逻辑

如果想让Promise成功执行下去,需要执行resolve,如果让它失败执行下去,需要执行reject
resolvethen,reject进catch

var p = new Promise(function(resolve,reject){
	// 这里用于实现异步任务
	// 成功时调用resolve()
	// 失败调用reject()
});
p.then(
   function (data) {
       // 从resolve得到正常结果
       console.log(data);
})
 .catch( 
   function (info) {
     // 从reject得到错误信息
     console.log(info);
})

5、小案例

var p = new Promise(function (resolve, reject) {
  setTimeout(function () {
    var flag = false;
    if (flag) {
      //正常情况下
      resolve("hello");
    } else {
      reject("出错了");
    }
  }, 1000);
});
// 方法
p.then(
  function (data) {
    console.log(data);
  }).catch( function (info) {
    console.log(info);
  })
// 方法
p.then(
  function (data) {
    console.log(data);
  },function (info) {
    console.log(info);
  })

// 方法一和方法二等效

6、终止执行

如果想终止在某个执行链的位置可以Promise.reject(new Error())

new Promise(function(resolve, reject) {
    resolve(1)
}).then(result => {
    return result + 1
}).then(result => {
    return result + 1
}).then(result => {
	// 终止掉程序,不再进入一个then而是进入catch
  return  Promise.reject(new Error(result + '失败'))
   // return result + 1
}).then(result => {
    return result + 1
}).catch(error => {	
    alert(error)
})

三、基于Promise处理Ajax请求

1、封装Promise函数处理原生Ajax请求

封装Promise函数

function queryData() {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
      if (xhr.readyState != 4) return; //不做处理
      if (xhr.status == 200) {
        //处理正常的情况
        resolve(xhr, responseText);
      } else {
        //处理异常的情况
        reject("出错了");
      }
    };
    xhr.open("get", "/data");
    xhr.send(null);
  });
}

2、then参数中的函数返回值

返回Promise实例对象
返回的该实例对象调用一个then

queryData("http://localhost:3000/data")
  .then(function (data) {
    console.log(data);
  })
  .catch(function (info) {
    console.log(info);
  });

② 返回普通值
返回的普通值会直接传递给下一个then,通过then参数中函数的参数接收该值

//发送多个ajax请求并且保证顺序
queryData("http://localhost:3000/data")
  .then(function (data) {
    console.log(data);
    return qureyData("http://localhost:3000/data1");
  })
  .then(function (data) {
    console.log(data);
    return qureyData("http://localhost:3000/data2");
  })
  .then(function (data) {
    console.log(data);
  });

四、Promise常用的API

1、实例方法

原型中的方法

方法 说明
.then() 得到异步执行任务正确结果
.catch() 获取异常信息
.finally() 成功与否都会执行
queryData()
  .then(function (data) {
    console.log(data);
  })
  .catch(function (info) {
    console.log(info);
  })
 .finally(function (info) {
    console.log(info);
  })

2、对象方法

方法 说明
Promise.all() 并发处理多个异步任务,所有任务都执行完成才能得到结果
Promise.race() 并发处理多个异步任务,只要有一个任务完成就得到结果
Promise.all([p1,p2,p3]).then(result=>{
  console.log(result);
})

Promise.race([p1,p2,p3]).then(result=>{
   console.log(result);
})

原文地址:https://blog.csdn.net/Vest_er/article/details/127465507

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_22260.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注