Promise.resolve 方法,Promise.reject 方法
有時需要將現有對象轉爲Promise對象,Promise.resolve方法就起到這個作用。
var jsPromise = Promise.resolve($.ajax('/whatever.json'));
上面代碼將 jQuery 生成 deferred 對象,轉爲一個新的 ES6 的 Promise 對象。
如果 Promise.resolve 方法的參數,不是具有 then 方法的對象(又稱 thenable 對象),則返回一個新的 Promise 對象,且它的狀態爲fulfilled。
var p = Promise.resolve('Hello'); p.then(function (s){ console.log(s) }); // Hello
上面代碼生成一個新的Promise對象的實例p,它的狀態爲fulfilled,所以回調函數會立即執行,Promise.resolve方法的參數就是回調函數的參數。
如果Promise.resolve方法的參數是一個Promise對象的實例,則會被原封不動地返回。
Promise.reject(reason)方法也會返回一個新的Promise實例,該實例的狀態爲rejected。Promise.reject方法的參數reason,會被傳遞給實例的回調函數。
var p = Promise.reject('出錯了'); p.then(null, function (s){ console.log(s) }); // 出錯了
上面代碼生成一個Promise對象的實例,狀態爲rejected,回調函數會立即執行。
Promise.prototype.catch方法:捕捉錯誤
Promise.prototype.catch 方法是 Promise.prototype.then(null, rejection) 的別名,用於指定發生錯誤時的回調函數。
getJSON("/posts.json").then(function(posts) { // some code }).catch(function(error) { // 處理前一個回調函數運行時發生的錯誤 console.log('發生錯誤!', error); });
Promise 對象的錯誤具有"冒泡"性質,會一直向後傳遞,直到被捕獲爲止。也就是說,錯誤總是會被下一個 catch 語句捕獲。
getJSON("/post/1.json").then(function(post) { return getJSON(post.commentURL); }).then(function(comments) { // some code }).catch(function(error) { // 處理前兩個回調函數的錯誤 });