Promise与deferred

1 篇文章 0 订阅
1 篇文章 0 订阅

Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers )。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象

一个 Promise有以下几种状态:
- pending: 初始状态,不是成功或失败状态。
- resolved: 已经有结果的状态,包括:fulfilled操作成功完成, rejected: 意味着操作失败。

构造函数:

new Promise(
    function(resolve, reject) {
        if(true){
            resolve(1);
        }else{
            reject(2);
        }
    }
);

属性:
Promise.length:长度属性,其值总是为 1 (构造器参数的数目).
Promise.prototype:表示 Promise 构造器的原型.
方法:
Promise.prototype.then(onFulfilled, onRejected)

var p1 = new Promise(
    function(resolve, reject) {
        if(true){
            resolve(1);
        }else if(true){
            reject(2);
        }else{
            throw new Error('错了');
        }
    }
);
p1.then(function(value) {
    alert(value);//alert(1)
}, function(reason) {
    alert(reason);//alert(2)或者alert(错了)
});

Promise.resolve(value)回一个promise对象,这个promise对象是被解析后(resolved)的。

var p = Promise.resolve([1,2,3]);
p.then(function(v) {
  console.log(v[0]); // 1
});

Promise.all 等待所有代码的完成(或第一个代码的失败)。

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise(function(resolve, reject){
  setTimeout(resolve, 100, "foo");
}); 
Promise.all([p1, p2, p3]).then(function(values){ 
  console.log(values); // [3, 1337, "foo"] 
});

Promise.prototype.catch(onRejected)

var p1 = new Promise(
    function(resolve, reject) {
        if(true){
            resolve(1);
        }else if(true){
            reject(2);
        }else{
            throw new Error('错了');
        }
    }
);
p1.then(function(value) {
    alert(value);//alert(1)
})
.catch(function(reason) {
    alert(reason);//alert(2)或者alert(错了)
});

备注:Uncaught的意思是代表有reject状态没有被catch。
详情请参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
详情请参考:http://blog.csdn.net/u013628992/article/details/50683255

$.Deferred:构造函数创建一个新的Deferred(延迟)对象。new 运算是可选的。

var dtd = $.Deferred(); // 新建一个deferred对象
var wait = function(dtd){
    var tasks = function(){
        alert("执行完毕!");
        dtd.resolve(); // 改变deferred对象的执行状态
    };
    setTimeout(tasks,5000);
    return dtd;
};

deferred.notify(args) = > deferred.progress( progressCallbacks )

(deferred.resolve(args)或 deferred.resolveWith(context,args))= > deferred.done( doneCallbacks [, doneCallbacks ] ) = > deferred.isResolved()

(deferred.reject(args) 或deferred.rejectWith(context,args))= > deferred.fail( doneCallbacks [, doneCallbacks ] ) = > deferred.isRejected()

deferred.then( doneCallbacks, failCallbacks [, progressCallbacks ] ) 与 deferred.always( alwaysCallbacks [, alwaysCallbacks ] ):后者是Deferred(延迟)得到解决或者拒绝时, alwaysCallbacks 始终都会被执行。前者是当Deferred(延迟)对象解决,拒绝或仍在进行中时,调用添加处理程序。

$.when(deferreds):提供一种方法来执行一个或多个对象的回调函数, Deferred(延迟)对象通常表示异步事件。

deferred.promise():回Deferred(延迟)的Promise(承诺)对象。Promise (承诺)对象仅会暴露那些需要绑定额外的处理或判断状态的延迟方法(then, done, fail, always, pipe, progress, 和 state)时,并不会暴露任何用于改变状态的延迟方法(resolve, reject, notify, resolveWith, rejectWith, 和 notifyWith).

eferred.state(): 方法返回一个字符串,代表Deferred(延迟)对象的当前状态。
-“pending”: Deferred对象是尚未完成状态 (不是 “rejected” 或 “resolved”).
-“resolved”: Deferred对象是在解决状态,这意味着,deferred.resolve() 或者 deferred.resolveWith()被对象访问和doneCallbacks被访问(或在被调用的过程中) 。
-“rejected”: Deferred对象是在被拒绝的状态,这意味着,deferred.reject() 或者 deferred.rejectWith() 被对象访问和failCallbacks被访问(或在被调用的过程中) 。

注意:返回的 Promise 被链接到延迟对象上,保存在元素的 .data() 中。由于 .remove() 方法会移除元素上的 data,同时也会移除元素本身。所以,使用它会防止任何元素上未被受理的(unresolved) Promise 被受理(resolving)。如果有必要在元素的 Promise 被受理(resolved)之前,从 DOM 中移除该元素的话,请使用 .detach() 来代替。之后再调用 .removeData()

var wait = function(ms) {
    var dtd = $.Deferred();
    setTimeout(dtd.resolve, ms);
    return dtd; //此处也可以直接返回dtd
};
var now = wait(2500);
now.reject();
now.done(function() {
    console.log('haha,师太,你可让老衲久等了');
}).fail(function() {
    console.log('失败了');
}).progress(function(res) {
    console.log('等待中...');
});
//console.log('失败了');
var wait = function(ms) {
    var dtd = $.Deferred();
    setTimeout(dtd.resolve, ms);
    return dtd.promise(); //此处也可以直接返回dtd
};

var now =wait(2500);
now.reject();
now.done(function() {
    console.log('haha,师太,你可让老衲久等了');
}).fail(function() {
    console.log('失败了');
}).progress(function(res) {
    console.log('等待中...');
});
//Uncaught TypeError: now.reject is not a function

具体请参考:https://segmentfault.com/a/1190000000523676
具体请参考:http://www.jquery123.com/category/deferred-object/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值