Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) 、Resolved(已经完成)和Rejected(已失败)

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

1
2
3
4
5
6
7
var promise=new Promise(function(resove,reject){
     if (/* 异步操作成功 */){
    resolve(value);
  else {
    reject(error);
  }
})

Promise实例生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。

1
2
3
4
5
promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

案例

1
2
3
4
5
6
7
var promise=new Promise(function(resolve,reject){
         console.log('promise');
     })
     promise.then(function(){
        console.log('我后执行')
     })
     console.log('我先执行')<br><br>//上面代码中,Promise新建后立即执行,所以首先输出的是“Promise”。然后,<code>then</code>方法指定的回调函数,<br>//将在当前脚本所有同步任务执行完才会执行,所以“我后执行” 最后输出。

ajax

var http = {

    get: function(url) {
        var promise = new Promise(function(resolve, reject) {
            $.ajax({
                url: url,
                method: 'get',
                success: function(data) {
                    resolve(data);
                },
                error: function(xhr, statusText) {
                    reject(statusText);
                }
            });
        });
        return promise;
    }
};
http.get('solve.php').then(function(data) {
    return data;
}, function(err) {
    return Promise.reject('Sorry, file not Found.');
}).then(function(data) {
    document.write(data);
}, function(err) {
    document.write(err);
});

Promise三种状态

pending、resolved、rejected

使用语法

var promis = new Promise(function(resolve,reject){ $.ajax({ url:'/api/something.json', method:'get', datatype:'json', success:(res) =>{ resolve(res) }, error:(err)=>{ reject(err) } }) }) promis.then(function(res){ console.log(res) }).catch(function(err){ console.log(err) });

Promise.prototype.then()

链式调用,状态变为resolve
如果把下一步想要的东西return出去,即可让下一个then使用

var promise = new Promise(function(resolve,reject){ $.ajax({ url:'/api/poisearch.json', method:'get', datatype:'json', success:(res) =>{ resolve(res) }, error:(err)=>{ reject(err) } }) }) promise.then(function(res){ return res.data }).then(function(data){ return data.result; }).then(function(result){ console.log(result) });

上面的代码还可以借用箭头函数简写成,极大提升了代码的简洁性和可读性

promise.then(res => res.data).then(data => data.result) .then(result => console.log(result));

Promise.prototype.catch()

如果异步操作抛出错误,状态就会变为Rejected,就会调用catch方法指定的回调函数,处理这个错误。

  1. 另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
  2. 如果Promise状态已经变成Resolved,再抛出错误是无效的。
  3. catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法。

promise中调用ajax相关推荐

  1. chrome插件中调用ajax,Chrome扩展程序中的Ajax调用无效

    尝试在Chrome扩展程序中发送ajax请求.我已经确认请求返回200响应,它应该只是console.log来测试'.我不确定这里是否存在异常问题?我已经阅读了Chrome扩展程序' addListe ...

  2. 在微信中调用ajax出现的问题

    问题:微信中弹出这个 分析:现XMLHttpRequest.status等于0,XMLHttpRequest.readyState等于0,说明窗体中有XMLHttpRequest对象却没有初始化,接下 ...

  3. 使用fetch封装ajax_如何使用Fetch在JavaScript中进行AJAX调用

    使用fetch封装ajax I will be sharing bite sized learnings about JavaScript regularly in this series. We'l ...

  4. javascript-前后端交互-异步调用Ajax与Promise比较

    javascript-前后端交互-异步调用Ajax与Promise比较 目录 文章目录 1.异步调用 1.1.使用场景 1.2.Ajax使用 1.2.1.启动后台 1.2.2.编写前端测试页面 1.3 ...

  5. php变量在html调用函数调用,PHP_如何在html标记中调用的函数里传递对象,最近使用jquery结合Ajax开发一个 - phpStudy...

    如何在html标记中调用的函数里传递对象 最近使用jquery结合Ajax开发一个中小型网站应用.在后台管理中要使用Ajax调用系统功能,根据Ajax的返回结果,使用jQuery对前台页面进行操作. ...

  6. ajax远程调用,jquery中的ajax方法怎样通过JSONP进行远程调用

    关于JSONP的概念和为什么要使用JSONP网上已经有很多教程,这一节主要演示下在JQUERY中的ajax方法怎样通过JSONP进行远程调用 首先介绍下$.ajax的参数 type:请求方式 GET/ ...

  7. jquery ajax循环调用,每个循环jQuery中的Ajax调用

    这是一个函数,我必须通过ajax调用写入一个xml文件.该代码在第一次进行ajax调用时工作正常.在每个循环的第二个循环中,ajax调用完全没有进行.我不知道为什么.我指定asyn为false.这没有 ...

  8. 为什么要用promise处理ajax,用promise.all解决ajax异步循环请求问题

    Promise.all() 并不能解决循环的问题,一般情况下 .all() 的参数是 Promise 数组(暂时不考虑其它类似).那么,数组中的每个 Promise 都代表着一个异步操作,Promis ...

  9. React基础-React中发送Ajax请求以及Mock数据

    前言 在 React 中, render 函数返回的结果,取决于组件的 props 和 state 我们都知道 UI 页面上的数据不是写死的,往往是从后端的数据接口中拿到的 然后将真实的数据填充到页面 ...

最新文章

  1. GNU/Linux平台上正则表达式的简单使用
  2. [C++对象模型][8]多重继承与虚函数表
  3. python flask 如何修改默认端口号
  4. SpringBoot_配置-外部配置加载顺序
  5. Spring请求级备忘录
  6. 【JAVA基础篇】抽象类和接口的区别
  7. ubuntu7.10中的apache的一些设置
  8. 加速包可能没用!12306屏蔽多个抢票软件
  9. yuv格式转换是那个组织定义的_YUV格式
  10. 不要进行过度设计,某一层存在真的有意义吗?是否可以更简单。
  11. VS中编辑器显示行号
  12. Android数据库框架LitePal详解
  13. 大数据集群安装02之Hadoop配置
  14. 2018-2019-1 20165318 20165322 20165326 实验二 固件程序设计
  15. 人体反应测试仪 c语言,有趣的人体反应速度测试电路
  16. 2021“智荟杯”浦发百度高校极客挑战赛——比赛总结
  17. 吴军推荐给中学生的书单
  18. 给Scrapy添加代理
  19. 在aws亚马逊云EC2上创建root用户,并使用root用户登录
  20. CSS复合选择器,元素的显示模式,CSS背景设置

热门文章

  1. 【简便解法】1077 互评成绩计算 (20分)_32行代码AC
  2. 1.7 ConcurrentHashMap增删改查
  3. php 根据坐标计算范围内,php计算经纬度是否在区域内
  4. java 捕获特定异常_java – 使用特定消息捕获异常
  5. python累加求和_python中的变量和数据类型(一)
  6. 华为交换机配置Telnet步骤
  7. 路由交换以及其他网络名词基本概念
  8. STM32 CAN过滤器
  9. Tomcat中session的管理机制
  10. 虚拟机上部署的项目 访问路径怎么写_桌面虚拟化即将流行开来——基于Hyper-V虚拟机的桌面虚拟化部署...