碼農(nóng)干貨系列【18】--getting started with Promise.js(總)
2013-05-03 15:30 【當(dāng)耐特】 閱讀(4347) 評(píng)論(3) 收藏 舉報(bào)引用Promise.js
<script src="promise.js"></script>
你可以點(diǎn)擊這里下載。
ps:如果使用了SCJ Framework,請(qǐng)使用SCJ.createPromise代替下面的Promise
done/resolve
promise.js提供了done和resolve方法,done負(fù)責(zé)注冊(cè)成功的回調(diào)函數(shù),resolve負(fù)責(zé)觸發(fā)。
function cb() { alert('success') } var prms = Promise() prms.done(cb) setTimeout(function() { prms.resolve() }, 3000)
在3秒之后,瀏覽器將alert “success”。
當(dāng)然你也可以通過prms.resolve(“xxx”)傳遞參數(shù)給cb函數(shù)使用,如:
function cb(num) { alert(num) } var prms = Promise() prms.done(cb) setTimeout(function() { prms.resolve(1) }, 3000)
在3秒之后,瀏覽器將alert “1”。
fail/reject
fail函數(shù)負(fù)責(zé)注冊(cè)失敗的回調(diào)函數(shù),reject負(fù)責(zé)觸發(fā)。如:
function cb() { alert('fail') } var prms = Promise() prms.fail(cb) setTimeout(function () { prms.reject() }, 3000)
progress/notify
progress函數(shù)負(fù)責(zé)注冊(cè)處理中進(jìn)度的回調(diào)函數(shù),notify負(fù)責(zé)觸法。如:
function cb() { alert('progress') } var prms = Promise() prms.progress(cb) setInterval(function() { prms.notify() }, 2000)
每隔兩秒瀏覽器會(huì)彈出一個(gè)progress。
chain
function cb1() { alert('success') } function cb2() { alert('fail') } function cb3() { alert('progress') } var prms = Promise(); prms.done(cb1).fail(cb2).progress(cb3) setTimeout(function () { prms.resolve() //prms.reject() //prms.notify() }, 3000)
then
function fn1() { alert('success') } function fn2() { alert('fail') } function fn3() { alert('progress') } var prms = Promise() prms.then(fn1, fn2, fn3) prms.resolve() prms.reject() prms.notify()
當(dāng)然也支持prms.then().then().then()……….
當(dāng)then的第一個(gè)參數(shù)為一個(gè)數(shù)組的時(shí)候,要等所有task都完成:
f1().then([f2_1, f2_2]).then(f3)
如上面的代碼:
f1執(zhí)行完后,同時(shí)執(zhí)行f2_1和f2_2,當(dāng)f2_1和f2_2全部都執(zhí)行完成才會(huì)執(zhí)行f3。
any
f1().any([f2_1, f2_2]).then(f3)
f1執(zhí)行完后,同時(shí)執(zhí)行f2_1和f2_2,當(dāng)f2_1和f2_2中的任意一個(gè)執(zhí)行完成才會(huì)執(zhí)行f3。
always
var prms = Promise() prms.always(function () { alert(2) }) setTimeout(function () { // prms.resolve() prms.reject() }, 3000)
always(fn)等同于then(fn,fn),也等同于done(fn).fail(fn)
wait
function f10() { var promise = Promise(); setTimeout(function () { console.log(10); promise.resolve(); }, 4500) return promise; } function f11() { var promise = Promise(); setTimeout(function () { console.log(11); promise.resolve(); }, 1500) return promise; } f11().wait(5000).then(f10) //execute f11 then wait 5000ms then execute f10
ensure
ensure方法類似try…catch..finally中的finally,不管task成功失敗都會(huì)執(zhí)行。
Promise.when
Promise.when(f1(), f2()).then(f3).then(f4)
function f1() {
var promise = Promise();
setTimeout(function () {
console.log(1);
promise.resolve("from f1");
}, 1500)
return promise;
}
function f2() {
var promise = Promise();
setTimeout(function () {
console.log(2);
promise.resolve();
}, 5500)
return promise;
}
function f3() {
var promise = Promise();
setTimeout(function () {
console.log(3);
promise.resolve();
}, 1500)
return promise;
}
function f4() {
var promise = Promise();
setTimeout(function () {
console.log(4);
promise.resolve();
}, 1500)
return promise;
}
上面promise.when的等同簡(jiǎn)略寫法也可以是:Promise(f1(),f2()).then….
Promise.any
Promise.any的使用和when一樣,when的意義是等所有task都完成再執(zhí)行后面的task,而any的意義是任何一個(gè)task完成就開始執(zhí)行后面的task。
Promise.timeout
Promise.timeout(f1(), 2000).then(f2, function () { alert("timeout"); }).wait(5000).then(f3); function f1() { var promise = Promise(); setTimeout(function () { console.log(1); promise.resolve("from f1"); }, 1500) return promise; } function f2() { var promise = Promise(); setTimeout(function () { console.log(2); promise.resolve(); }, 1500) return promise; } function f3() { var promise = Promise(); setTimeout(function () { console.log(3); promise.resolve(); }, 1500) return promise; }
with wind.js
<script src="wind-all-0.7.3.js"></script> <script src="promise.js"></script> <script> Wind.Promise.create = function (fn) { var prms = Promise(); fn(prms.resolve, prms.reject); return prms; } var testAsync = eval(Wind.compile("promise", function () { for (var i = 0; i < 3; i++) { //loop 3 times var aa = $await(f1()); alert(aa); //alert “from f1” $await(f2().wait(3000)); //execute f2 then wait 3000ms $await(f3()); } })); testAsync(); function f1() { var promise = Promise(); setTimeout(function () { console.log(1); promise.resolve("from f1"); }, 2500) return promise; } function f2() { var promise = Promise(); setTimeout(function () { console.log(2); promise.resolve(); }, 1500) return promise; } function f3() { var promise = Promise(); setTimeout(function () { console.log(3); promise.resolve(); }, 1500) return promise; } </script>
That’s all.Have Fun!
浙公網(wǎng)安備 33010602011771號(hào)