最近一下班就沒有持續學習,已經持續了幾個月,回家就是練練字,看看書,幹些七七八八的事。這樣的生活總感覺空落落的,畢業半年了,總感覺自己很多東西明白的不清不楚,希望接下來的每一天都能扎扎實實學好。
一、出現前景,promise是什麼
二、基本使用規則
es6 規定,promise物件是乙個建構函式,用來生成promise例項
const promise = new promise(function(resolve, reject)
else
});
從上面**可以看到promise建構函式接受乙個函式作為引數,該函式的兩個引數分別是resolve和reject,此外這兩個引數是連兩個函式,由js引擎提供。
那麼這兩個函式的作用是:
(1) resolve: 將promise物件的狀態從未完成變成成功,非同步操作成功時呼叫。
(2) reject: 將promise物件的狀態從未完成變成失敗,非同步操作失敗時呼叫。
當promise例項生成後,就可以用then方法指定resolve狀態和reject狀態的**函式,then方法接受兩個**函式作為引數:
第乙個**是當promise物件的狀態為resolve時呼叫
第二個**函式是當promise物件的狀態為reject時呼叫,第二個**函式可選
基本案例:
var promise = new promise(function(resolve, reject) )
promise.then(
function
(resolve) ,
function
(reject) )
結果輸出:
我是當前指令碼的同步任務,then方法指定的**函式等下我,你的在我後面排隊
promise的狀態為resolve,所以我被呼叫出來啦
promise.prototype.then()
promise 例項具有then方法, 那麼then方法是定義在原型物件promise.prototype上的
then方法返回的也是乙個新的promise例項,因此可以採用鏈式寫法,即then方法後面再呼叫另乙個then方法
run1.then(function(data) ).then(function(data) ).then(function(data) )
上面的**使用then
方法,第乙個**函式完成以後,會將返回結果作為引數,傳入第二個**函式。
promise.prototype.catch():
用於指定發生錯誤時的**函式
run1.then(function(data) ).
catch(function
(data) )
看到這裡的時候,可能會覺得promise物件不是有一種失敗呼叫的reject函式麼,如下格式:
run1.then(function(data) ,
function
(data) )
對比這兩種寫法,第一種寫法要好於第二種寫法,理由是通過catch可以捕獲前面then
方法執行中的錯誤,更接近同步的寫法(try/catch
)。
因此,建議總是使用catch
方法,而不使用then
方法的第二個引數。
下面是乙個用promise
物件實現的 ajax 操作的例子:
三、手寫乙個promise
*同步操作,且then只能呼叫一次
doctype html
>
<
html
>
<
head
>
<
meta
charset
="utf-8"
>
<
meta
name
="viewport"
content
="width=device-width,initial-scale=1.0"
>
<
title
>同步操作,且then只能呼叫一次
title
>
head
>
<
body
>
<
div
id="box"
>12
div>
<
script
>
function
promise(exector)
}function
reject(reason)
}try
catch
(e)
}promise.prototype.then
=function
(onfulfilled, onrejected)
if(this
.status
==='
rejected')
}let promise1
=new
promise(
function
(a, b) )
promise1.then(data
=>
, err
=>
)script
>
body
>
html
>
顯然我們平時用的都是非同步的方式,再來改改。需要在建構函式中存放兩個陣列,分別儲存成功**和失敗的** 因為可以then多次,所以需要將這些函式放在陣列中
*非同步操作,且then只能呼叫一次
doctype html
>
<
html
>
<
head
>
<
meta
charset
="utf-8"
>
<
meta
name
="viewport"
content
="width=device-width,initial-scale=1.0"
>
<
title
>非同步操作,且then只能呼叫一次
title
>
head
>
<
body
>
<
div
id="box"
>12
div>
<
script
>
function
promise(exector) )
//遍歷then中成功的所有**函式
} }
function
reject(reason) )
//遍歷then中失敗的所有**函式
} }
try
catch
(e)
}promise.prototype.then
=function
(onfulfilled, onrejected)
if(this
.status
==='
rejected')
if(this
.status
==='
pending
') )
this
.failcallback.push(()
=>
) }
}let promise1
=new
promise((resolve, reject)
=>
else
}, 1000
) })
promise1.then(data
=>
, err
=>
)script
>
body
>
html
>
* 非同步操作,then可以鏈式呼叫
promise 非同步載入的 自我理解
我認為promise相當於乙個容器,把一些發生未完成的事件儲存在promise容器中,在容器中發生完,在容器中的事件都繫結著三個可能存在的狀態,事件發生的結果影響著這三種的狀態,也只有非同步操作結果可以決定這三種狀態,其他任何操作都無法改變這種操作,一旦這種狀態改變,就不會再發生變化了,任何時候都可...
自我總結 20170804自我總結
昨天在工作了一年多的公司離職了。2016年6月27日入職九章雲極科技 到2017年8月3日。短短一年之內,自己從乙個新人混到了老員工,自己入職的時候才26個人,目前有80 預計下個月達到100人。自己也在公司內部經歷了轉崗。非常感謝能在畢業的時候,被越哥選中,慢慢的一年內學習了如何做資料整合,自己也...
promise方法總結
優點 1 物件的狀態不受外界的影響,只有非同步操作的結果可以決定是那種狀態 2 狀態一旦改變,就不會再次改變。任何時候都可以得到這個結果。在這裡跟 event 事件不同,如果錯過了這個事件結果再去監聽,是監聽不到event事件的。缺點 1 promise一旦執行無法取消。2 如果不設定 函式prom...