ES6 對 Promise 有了原生的支持,但微信開發者工具更新版本(0.11.112200)后, 移除了開發者工具對 ES6 中 Promise 特性原生的支持, 理由是因為實體機器是不支持 Promise 的, 所以需要引入第三方的 Promise 庫。 PromisePromise是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。 所謂Promise,簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。從語法上說,Promise是一個對象,從它可以獲取異步操作的消息。Promise提供統一的API,各種異步操作都可以用同樣的方法進行處理。 Promise對象有以下兩個特點:
有了Promise對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise對象提供統一的接口,使得控制異步操作更加容易。Promise也有一些缺點。首先,無法取消Promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設置回調函數,Promise內部拋出的錯誤,不會反應到外部。第三,當處于Pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。 es-promisees6-promise 是一個兼容 ES6 Promises 的Polyfill類庫。 它基于 RSVP.js 這個兼容 Promises/A+ 的類庫, 它只是 RSVP.js 的一個子集,只實現了Promises 規定的 API。 基本用法創建Promise對象 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 函數接受一個參數,如果為true輸出”Hello World!”,如果為false就輸出錯誤的信息。helloWord 函數返回的是一個 Promise 對象。resolve 方法可以使 Promise 對象的狀態改變成成功,同時傳遞一個參數用于后續成功后的操作。reject 方法則是將 Promise 對象的狀態改變為失敗,同時將錯誤的信息傳遞到后續錯誤處理的操作。 每一個 Promise 都有一個 .then 方法,這個方法接受兩個參數,第一個是處理 resolved 狀態的回調,一個是處理 rejected 狀態的回調 Promise.all 可以接收一個元素為 Promise 對象的數組作為參數,當這個數組里面所有的 Promise 對象都變為 resolve 時,該方法才會返回。 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"] }); 以上代碼,模擬了傳輸兩個數據需要不同的時長,雖然 p2 的速度比 p1 要快,但是 Promise.all 方法會按照數組里面的順序將結果返回。 其他 |