Promise學習
閱讀廖雪峯的官方網站Promise後,自己記錄下理解。
Promise對象,其實就是承諾執行,怎麼解釋,看下面的例子。
new Promise(function (resolve, reject){
// 這兩個參數,就是兩個函數,我們在函數內覺得什麼時候執行。
var num = Math.random()*10
// 當num > 5 我們1秒後執行resolve()
// 當num < 5 我們1秒後執行reject()
setTimeout(function(){
if (num > 5) {
console.log('num = '+ num + '我們執行resolve()')
resolve()
} else {
console.log(('num = '+ num + '我們執行reject()'))
reject()
}
},1000)
}).then(function(){
console.log('我們是執行resolve()');
}).catch(function(){
console.log('我們是執行reject()');
})
這就是最基本的Promise用法,我們不要被新事物迷惑,抓住根本才最重要。
當然我們也可以鏈式調用,如:p.then().then().catch()
var p1 = function (num) {
return new Promise(function (resolve, reject) {
console.log(num + num)
setTimeout(resolve, 1000, num + num)
})
}
var p2 = function (num) {
return new Promise(function (resolve, reject) {
console.log(num * num)
setTimeout(resolve, 1000, num * num)
})
}
var p = new Promise(function (resolve, reject) {
console.log(11);
resolve(11)
})
p.then(p1).then(p2).then(p1).then(function () {
console.log('end')
})
這裏將一個promise函數供then調用,然後又return一個promise,然後繼續調用,最後執行then函數打印end,當然我們也可以在其中加入catch,在返回的promise函數中調用。
如果多個promise函數 同時執行的話,我們可以用Promise.all方法
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
// 同時執行p1和p2,並在它們都完成後執行then:
Promise.all([p1, p2]).then(function (results) {
console.log(results); // 獲得一個Array: ['P1', 'P2']
});
還有一種,我們想兩個地址同時請求插件JS,但是我們只需要一個,這時候就可以用Promise.race方法,只會返回先返回結果的,另一個方法雖然也會執行,但是結果不在返回。
var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 800, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
Promise.race([p1, p2]).then(function (result) {
console.log(result); // 'P2'
});
以上就是Promise方法。