|
ES6 對(duì) Promise 有了原生的支持,但微信開發(fā)者工具更新版本(0.11.112200)后, 移除了開發(fā)者工具對(duì) ES6 中 Promise 特性原生的支持, 理由是因?yàn)閷?shí)體機(jī)器是不支持 Promise 的, 所以需要引入第三方的 Promise 庫。 PromisePromise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。 所謂Promise,簡(jiǎn)單說就是一個(gè)容器,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果。從語法上說,Promise是一個(gè)對(duì)象,從它可以獲取異步操作的消息。Promise提供統(tǒng)一的API,各種異步操作都可以用同樣的方法進(jìn)行處理。 Promise對(duì)象有以下兩個(gè)特點(diǎn):
有了Promise對(duì)象,就可以將異步操作以同步操作的流程表達(dá)出來,避免了層層嵌套的回調(diào)函數(shù)。此外,Promise對(duì)象提供統(tǒng)一的接口,使得控制異步操作更加容易。Promise也有一些缺點(diǎn)。首先,無法取消Promise,一旦新建它就會(huì)立即執(zhí)行,無法中途取消。其次,如果不設(shè)置回調(diào)函數(shù),Promise內(nèi)部拋出的錯(cuò)誤,不會(huì)反應(yīng)到外部。第三,當(dāng)處于Pending狀態(tài)時(shí),無法得知目前進(jìn)展到哪一個(gè)階段(剛剛開始還是即將完成)。 es-promisees6-promise 是一個(gè)兼容 ES6 Promises 的Polyfill類庫。 它基于 RSVP.js 這個(gè)兼容 Promises/A+ 的類庫, 它只是 RSVP.js 的一個(gè)子集,只實(shí)現(xiàn)了Promises 規(guī)定的 API。 基本用法創(chuàng)建Promise對(duì)象
new Promise(function(resolve) {
reslove(42);
})
function helloWorld(ready) { return new Promise(function(resolve, reject) { if (ready) {
resolve("Hello World!");
} else {
reject("Good bye!");
}
});
}
helloWorld(true).then(function(message) { console.log(message);
}, function(error) { console.log("Error:", error);
}); // 輸出: Hello World!
helloWorld(false).then(function(message) { console.log(message);
}, function(error) { console.log("Error:", error);
}); // 輸出: Error: Good bye!
以上代碼,helloWord 函數(shù)接受一個(gè)參數(shù),如果為true輸出”Hello World!”,如果為false就輸出錯(cuò)誤的信息。helloWord 函數(shù)返回的是一個(gè) Promise 對(duì)象。resolve 方法可以使 Promise 對(duì)象的狀態(tài)改變成成功,同時(shí)傳遞一個(gè)參數(shù)用于后續(xù)成功后的操作。reject 方法則是將 Promise 對(duì)象的狀態(tài)改變?yōu)槭?,同時(shí)將錯(cuò)誤的信息傳遞到后續(xù)錯(cuò)誤處理的操作。 每一個(gè) Promise 都有一個(gè) .then 方法,這個(gè)方法接受兩個(gè)參數(shù),第一個(gè)是處理 resolved 狀態(tài)的回調(diào),一個(gè)是處理 rejected 狀態(tài)的回調(diào) Promise.all 可以接收一個(gè)元素為 Promise 對(duì)象的數(shù)組作為參數(shù),當(dāng)這個(gè)數(shù)組里面所有的 Promise 對(duì)象都變?yōu)?resolve 時(shí),該方法才會(huì)返回。
var p1 = new Promise(function(resolve) {
setTimeout(function() {
resolve("Hello");
}, 3000);
}); var p2 = new Promise(function(resolve) {
setTimeout(function() {
resolve("World");
}, 1000);
});
Promise.all([p1, p2]).then(function(result) { console.log(result); // 輸出: ["Hello", "World"]
});
以上代碼,模擬了傳輸兩個(gè)數(shù)據(jù)需要不同的時(shí)長(zhǎng),雖然 p2 的速度比 p1 要快,但是 Promise.all 方法會(huì)按照數(shù)組里面的順序?qū)⒔Y(jié)果返回。 其他 |