es5如何实现promise_es5实现promise,多异步请求返回数据

本文介绍了如何使用ES5实现Promise的功能,包括创建Q模块、定义deffer方法以及实现all方法来处理多个异步请求。通过示例展示了自定义Promise的使用,如延迟操作和模拟AJAX请求,以及如何通过Q.all处理并发请求的数据返回。
摘要由CSDN通过智能技术生成

最近研究es6的promise觉得非常好用,还有jquery的 $.Deferred()、node里面的Q模块,都研究了一遍,于是自己用es5写了一个类似的promise功能

首先模块代码

1 var Q ={};2 Q.deffer = function() {3 var fn ={};4 var resolve = null;5 var reject = null;6 var done = null;7 var promis ={8 then: function(resolved, rejected) {9 resolve = resolved || function() {};10 reject = rejected || function() {};11 returnpromis;12 },13 done: function(doned) {14 done = doned || function() {};15 returnpromis;16 }17 };18

19 fn.promise = function() {20 returnpromis;21 };22

23 fn.resolve = function(data) {24 setTimeout(function() {25 if(resolve) {26 resolve(data);27 }28 if(done) {29 done();30 }31 }, 0)32

33 };34

35 fn.reject = function(data) {36 setTimeout(function() {37 if(reject) {38 reject(data);39 }40 if(done) {41 done();42 }43 }, 0)44

45 };46

47 returnfn;48 }49

50 Q.all = function(list) {51 var fn ={};52 var resolve = null;53 var reject = null;54 var done = null;55 var resolveList =[];56 var rejectList =[];57 var promis ={58 then: function(resolved, rejected) {59 resolve = resolved || function() {};60 reject = rejected || function() {};61 returnpromis;62 },63 done: function(doned) {64 done = doned || function() {};65 returnpromis;66 }67 };68

69 var count = 0;70

71 for(var i = 0; i < list.length; i++) {72 try{73 list[i].then(function(data) {74 resolveList.push(data);75 if(resolveList.length ==list.length) {76 if(resolve) {77 resolve(resolveList);78 }79 }80 }, function(data) {81 rejectList.push(data);82 if(reject) {83 reject(data);84 }85 }).done(function() {86 count++;87 if(count >=list.length) {88 if(done) {89 done(resolveList,rejectList);90 }91 }92 });93 } catch(e) {94 if(done) {95 done(resolveList,rejectList,e);96 }97 }98

99 }100

101

102

103 returnpromis;104 };

使用例子1

function _delay(time) {

var def = Q.deffer();

if(time == 1) {

def.resolve({

"正确": "success"

});

} else {

def.reject({

"错误": "error"

});

}

return def.promise();

}

_delay(0).then(function(data) {

console.log("then");

console.log(data);

}, function(err) {

console.log(err);

}).done();

使用例子2

function request(){

var deferred = Q.deffer();

$.ajax({

type:"get",

url:"xxxxxxxxxxx",

success:function(data){

deferred.resolve(data);

},

error:function(error){

deferred.resolve(error);

}

});

return deferred.promise();

}

request().then(function(data){

console.log(data);

},function(err){

console.log(err);

}).done();

Q.all的用法,多个异步操作

function request(){

var deferred = Q.deffer();

$.ajax({

type:"get",

url:"xxxxx",

success:function(data){

deferred.resolve(data);

},

error:function(error){

deferred.resolve(error);

}

});

return deferred.promise();

}

var promiseArr = [];

promiseArr.push(request());

promiseArr.push(request());

Q.all(promiseArr).then(function(data){

console.log(data);

},function(er){

console.log(er);

}).done(function(resolve,reject,e){

console.log(‘done‘);

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值