在Vue中,我們可以使用Promise來處理異步請(qǐng)求,并通過done()方法來標(biāo)記請(qǐng)求已完成。done()方法的使用非常簡(jiǎn)單,只需要在Promise對(duì)象后面調(diào)用該方法即可:
new Promise((resolve, reject) =>{ // 進(jìn)行異步請(qǐng)求的代碼 }).then(() =>{ // 異步請(qǐng)求成功后的操作 }).catch(() =>{ // 異步請(qǐng)求失敗后的操作 }).done();
可以看出,done()方法并沒有參數(shù),其作用只是標(biāo)記請(qǐng)求已完成。這個(gè)方法和JS的Promise對(duì)象中的finally()方法類似,但是由于finally()在Vue中有其他含義,因此Vue為其重新定義了一個(gè)方法——done()。
我們可以將done()方法看做是Promise對(duì)象的后續(xù)處理方法,其會(huì)在Promise的then()或catch()方法執(zhí)行完畢后執(zhí)行。在實(shí)際業(yè)務(wù)中,我們經(jīng)常需要根據(jù)請(qǐng)求的完成狀態(tài),執(zhí)行一些操作,如隱藏loading、刷新頁面等。在這種情況下,done()方法就十分實(shí)用了。
需要注意的是,Vue并不推薦使用done()方法,因?yàn)槠洳⒉皇荅S6的規(guī)范,Vue開發(fā)團(tuán)隊(duì)也并沒有將其加入Vue的官方文檔中。如果我們非要使用done()方法,可以考慮將其定義為Promise對(duì)象的一個(gè)方法,從而避免可能的兼容性問題:
Promise.prototype.done = function (onFulfilled, onRejected) { this.then(onFulfilled, onRejected) .catch(function (reason) { // 拋出一個(gè)全局錯(cuò)誤 setTimeout(() =>{ throw reason }, 0); }); };
通過將done()方法定義為Promise對(duì)象的一個(gè)方法,我們可以使用ES6的語法來調(diào)用done()方法,如下所示:
new Promise((resolve, reject) =>{ // 進(jìn)行異步請(qǐng)求的代碼 }).then(() =>{ // 異步請(qǐng)求成功后的操作 }).catch(() =>{ // 異步請(qǐng)求失敗后的操作 }).done();
這樣做的好處是保證了done()方法的可靠性和兼容性。希望以上的講解對(duì)你有所幫助。