總結下promise對象的基本使用及注意點
首先看一個Promise的最簡單實例
寫法一:
function timeout(ms) {
//返回一個 promise 對象 return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done'); }); }
// setTimeout 可以接受第二個以外的值,這些值作為參數傳給它包含的回掉函數,本案例中是 resolve。所以也可以寫成如下:
// setTimeout((xxx) => { resolve(xxx) }, ms, 'done'); 又或者
// setTimeout(() => { resolve('done') },ms); 更多 setTimeout 傳參問題可自行搜索。
//返回 promise 才可調用它的 then 方法
timeout(100).then((value) => { console.log(value); });
//換成下面寫法就沒法傳遞參數 "ms"了。
寫法二:
function timeout(resolve, reject) {
setTimeout(resolve, 1000, 'done');
};
let p1 = new Promise(timeout);
p1.then((value) => {
console.log(value);
});
由上可以總結Promise使用的幾點
1. 要創建一個實例
var p1 = new Promise(functionX)
2. new Promise(functionX) 里的functionX只接受兩個參數 resolve, reject 寫了其他的會報錯。
Promise
構造函數接受一個函數作為參數,該函數的兩個參數分別是resolve
和reject
。它們是兩個函數,由 JavaScript 引擎提供,不用自己部署。
resolve
函數在異步操作成功時調用,並將異步操作的結果,作為參數傳遞出去。
reject
函數在異步操作失敗時調用,並將異步操作報出的錯誤,作為參數傳遞出去。
(摘自阮一峰ES6教程)
3. 之后創建的實例 p1 就可以使用 then方法:p1.then(callback1(參數),callback2(參數))
then() 語義很清楚,然后,是在事情處理完后就調用里面的callback函數。callback1,callback2分別對應參數 resolve 和 reject 。
then 里面 callback1 的參數,就是 上述 functionX 里 resolve 的參數。在上面實例中 resolve 的參數是 'done',則 then 里的 (value) value值就是 'done' 。
4. 實例紅色標注處表示,想要在 functionX 里傳入其他參數供函數內部邏輯使用,就需用第一種寫法:
定義一個函數,里面 return 一個Promise。函數執行后使用then方法 fn().then()
5. 其他概念性問題提一下
a. Promise 是異步編程的一種解決方案,比 setTimeout , setInterval 優先執行。(更多js事件機制請查看:https://segmentfault.com/a/1190000011198232)
b.不是異步就像setTimeout , setInterval 等有計時功能。
c. js 是單線程,所謂的異步只是把你規定為需要異步處理的事件擱在了之后執行。就好比 js 是個人的話他沒法影分身。(更多js異步請自行查閱資料)
參考鏈接: https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345008539155e93fc16046d4bb7854943814c4f9dc2000
參考鏈接:http://es6.ruanyifeng.com/#docs/promise