定制小程序开发Promise的基本用法,基于Promise处理ajax请求

目录

前言

Promise是ES6定制小程序开发引入的一个新的语法,定制小程序开发专门用于异步编程

一、JS中的

在js中,定制小程序开发异步编程有三种

1、

setInterval(() => { // ...}, interval);setTimeout(() => {	// ...}, timeout);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、ajax

$.ajax({    url,    data,    success:function (result){    	alert(result)    }})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、 定制小程序开发事件回调函数

 //定制小程序开发定义主函数,回调函数作为参数function A(callback) {    callback();    console.log('我是主函数');}//定义回调函数function B() {    setTimeout("console.log('我是回调函数')",2000);//即使此时时间设置为0,也会先输出主函数}//调用主函数,将B传进去A(B);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

多次依赖分析

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

二、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){ })
  • 1

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

4、基本逻辑

如果想让Promise成功执行下去,需要执行resolve,如果让它失败执行下去,需要执行reject
resolve进then,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);})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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);  })// 方法一和方法二等效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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)})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三、基于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);  });}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

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

queryData("http://localhost:3000/data")  .then(function (data) {    console.log(data);  })  .catch(function (info) {    console.log(info);  });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

② 返回普通值
返回的普通值会直接传递给下一个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);  });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

四、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);  })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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);})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发