JS的promise和extJS的promise的使用

平常我们写ajax是通过

Ext.Ajax.request({
    url: 'remove',  //请求的服务url
    method: 'POST',
    params: {
        num: num    //参数
    },
    success: function (response, opts) {
       //成功要做的事
    }
});
而promise对象,不收外界影响,代表异步操作

Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)

只有请求的结果,可以决定是上面三种状态,是哪一种。

主要作用:将异步操作,同步化。但是效率会高很多。

var promise = new Promise(function(resolve, reject) {
 if (/* 异步操作成功 */){
 resolve(value);
 } else {
 reject(error);
 }
});

promise.then(function(value) {
 // success
}, function(value) {
 // failure
});
Ext.Ajax.request({
    url: 'remove',  //请求的服务url
    method: 'POST',
    params: {
        num: num    //参数
    },
    
}).then(function(response,opts){}).otherwise(function(){}).always(function(){});
 
 
ExtJS的promise的实现方式
function getAjax (url) {
     // The function passed to Ext.Promise() is called immediately to start
     // the asynchronous action.
     //
     return new Ext.Promise(function (resolve, reject) {
         Ext.Ajax({
             url: url,

             success: function (response) {
                 // Use the provided "resolve" method to deliver the result.
                 //
                 resolve(response.responseText);
             },

             failure: function (response) {
                 // Use the provided "reject" method to deliver error message.
                 //
                 reject(response.status);
             }
         });
     });
 }

 getAjax('http://stuff').then(function (content) {
     // content is responseText of ajax response
 });
在写Ext.promise的时候
 reject: function (reason) {
            var deferred = new Ext.promise.Deferred();

            deferred.reject(reason);

            return deferred.promise;
        },
 resolve: function (value) {
            var deferred = new Ext.promise.Deferred();

            deferred.resolve(value);

            return deferred.promise;
        }
 constructor: function (action) {
        var deferred = new Ext.promise.Deferred();

        action(deferred.resolve.bind(deferred), deferred.reject.bind(deferred));

        return deferred.promise;
    }

那么什么是Deferred
这是一个延迟机制。在异步操作的函数体中使用,当操作成功,递延应该得到解决;如果操作失败,递延应予以驳回。
每个递延都有一个相关的promise。一个promise代表调用其递延当时的方法。
我们通过deferred.resolve() 就相当于直接执行,并返回成功。不会在执行then()里面的方法了。
相应的deferred.reject() 也是同样的原理

我在项目中使用:
先声明这个方法。
  getByCode: function (code, async) {
        var response = Ext.Ajax.request({
            url: this.baseUrl + "loadByCode.hd",
            method: 'GET',
            async: async,
            params: {
                code: code
            }
        });
        return Ext.decode(response.responseText, true);
    },
当然如果是promise必须是异步的,async:true
随后直接调用getByCode这个方法:
  FaEmpService.getByCode(value, true).then(function (response, opts) { //用异步方法调用,并增加遮罩
                var data = Ext.decode(response.responseText, true);
                if (Ext.isEmpty(data)) {
                   
                } else {
                   
                }
            }).done();
这里就是 成功之后执行then里面的方法。
为什么加.done()呢。因为这样如果出现异常 控制台是会报错的。

 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值