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