promise中调用ajax

 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方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Soyoger

听说打赏的都进了福布斯排行榜。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值