



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】小程序中改進(jìn)異步封裝的問題有哪些
在下給大家分享一下小程序中改進(jìn)異步封裝的問題有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!1.問題在Proxy封裝微信小程序的異步調(diào)用中留下了一個問題:像wx.request()
這種原本就有返回值的情況,該如何封裝呢?如果需要在請求的過程中取消請求,就會用到wx.request()的返回值:const
requestTask
=
wx.request(...);
if
(...)
{
//
因?yàn)槟承┰蛐枰∠@次請求
requestTask.abort();
}封裝過后的awx.request()會返回一個Promise對象,跟wx.request()原來的返回值毫無關(guān)系。如果想要能夠取消請求,就必須將wx.request()原來的返回值帶出來,應(yīng)該怎么辦?function
wxPromisify(fn)
{
return
async
function
(args)
{
return
new
Promise((resolve,
reject)
=>
{
const
originalResult
=
fn({
//
^^^^^^^^^^^^^^^^^^^^^^^
//
怎么把
originalResult
帶出去?
...(args
||
{}),
success:
res
=>
resolve(res),
fail:
err
=>
reject(err)
});
});
};
}2.可選方案也不賣關(guān)子了,這里有幾個方案可選:返回對象或數(shù)組,解構(gòu)后使用。比如返回{promise,originalResult}或[promise,originalResult];通過一個“容器”參數(shù)將返回值帶出來,比如awx.request(params,outBox={}),在處理時為outBox賦值:outBox.originalResult;JS是動態(tài)類型,可以直接修改Promise對象,為其附加屬性:promise.originalResult=...。從使用者的角度來考慮,多數(shù)時候是不需要原返回值的,這時候是肯定是希望awaitawx.request(),而不是先解構(gòu)再await(或then()),所以,第1種方法不可選。第2種方法可行,不需要原返回值的時候,直接使用即可。但是需要原返回值的時候,稍嫌麻煩,需要先產(chǎn)生一個容器對象傳入。第3種方法使用起來應(yīng)該是最“無感”的。無論如何,原值隨Promise對象帶出來了,用或是不用,請便!現(xiàn)在我們來實(shí)現(xiàn)第3種方法,改造wxPromisify():3.失敗的嘗試一開始想得很簡單,原來直接returnnewPromise(),現(xiàn)在加個臨時變量應(yīng)該就可以吧:function
wxPromisify(fn)
{
return
async
function
(args)
{
const
promise
=
new
Promise((resolve,
reject)
=>
{
//
^^^^^^^^^^^^^^^^
promise.originalResult
=
fn({
//
^^^^^^^^^^^^^^^^^^^^^^^^^
...(args
||
{}),
success:
res
=>
resolve(res),
fail:
err
=>
reject(err)
});
});
return
promise;
//
^^^^^^^^^^^^^^^
};
}然后得到一個錯誤:TypeError:
Cannot
set
property
'originalResult'
of
undefined這個錯很好理解,也很容易改……不過確實(shí)也很容易犯!本來是認(rèn)為promise是個局部變量,可以直接訪問,所以在其子作用域中使用是沒問題。但是這里忽略了這個子作用域是在構(gòu)造函數(shù)中。來大概分析一下:newPromise()需要一個函數(shù)(假設(shè)叫factory)作為參數(shù),但是這個factory執(zhí)行的時機(jī)是什么?注意到newPromise()產(chǎn)生Promise實(shí)例之后,我們再沒有主動調(diào)用這個實(shí)例的任何方法,所以可以斷定,factory是在構(gòu)造的過程中執(zhí)行的。換句話說,這時候Promise實(shí)例還沒產(chǎn)生呢,promise引用的是undefined。4.成功的嘗試既然已經(jīng)知道問題所在,我們接著分析。構(gòu)造Promise實(shí)例的過程中調(diào)用了factory,而factory的在函數(shù)體中直接執(zhí)行了fn,可以立即拿到fn的返回值,所以這個Promise實(shí)例構(gòu)造完成之后,是可以拿到原返回值的?,F(xiàn)在來修改一下代碼:function
wxPromisify(fn)
{
return
async
function
(args)
{
let
originalResult;
//
^^^^^^^^^^^^^^^^^^^
const
promise
=
new
Promise((resolve,
reject)
=>
{
originalResult
=
fn({
//
^^^^^^^^^^^^^^
...(args
||
{}),
success:
res
=>
resolve(res),
fail:
err
=>
reject(err)
});
});
promise.originalResult
=
originalResult;
//
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return
promise;
};
}我們需要在newPromise()之后對promise.originalResult賦值,而這個“值”產(chǎn)生于newPromise()的過程中,那么再加個局部變量originalResult把它帶出來就好。搞定!5.搞笑卻又應(yīng)該嚴(yán)肅對待的事情本來應(yīng)該結(jié)束了,但我猜一定會有人這么干(因?yàn)槲以谄渌麍鼍跋乱娺^):注意:下面這個是錯誤示例!function
wxPromisify(fn)
{
return
async
function
(args)
{
let
promise
=
new
Promise();
//
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
promise
=
new
Promise((resolve,
reject)
=>
{
//
^^^^^^^^^^
promise.originalResult
=
fn({
...
});
//
^^^^^^^^^^^^^^^^^^^^^^
});
return
promise;
};
}這樣做不會產(chǎn)生前面提到的TypeError,但是外面拿到的Promise對象卻并不攜帶originalResult。具體原因跟上面失敗的那次嘗試一樣,所以不再詳述,只提醒一下:這里產(chǎn)生了兩個Promise對象。6.再啰嗦一下這次帶出原返回值是以wx.request()為例,其返回值的主要用途是提供.abort()方法
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作投資建廠合同范本
- 廠房機(jī)器租賃合同范本
- 農(nóng)村樁基購買合同范本
- 合伙成立公司合同范本
- 出租餐具搬家合同范本
- 博士勞務(wù)合同范本
- 2025年傳統(tǒng)文化主題班會教案:弘揚(yáng)中華傳統(tǒng)文化
- 合同范本包含些內(nèi)容
- 城市照明行業(yè)分析研究報(bào)告
- 農(nóng)村房地過戶合同范本
- 2025年廣西職業(yè)院校技能大賽高職組(商務(wù)數(shù)據(jù)分析賽項(xiàng))參考試題庫資料及答案
- 2025年黑龍江農(nóng)墾職業(yè)學(xué)院單招職業(yè)傾向性測試題庫帶答案
- 四年級下冊 道德與法治 全冊教案
- 個人租房房屋合同范本
- MSA測量系統(tǒng)培訓(xùn)
- 線上教育平臺教師教學(xué)行為規(guī)范與責(zé)任書
- 2025年內(nèi)蒙古法院系統(tǒng)招聘用制書記員2988人過渡高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 中央2025年全國婦聯(lián)所屬在京事業(yè)單位招聘93人筆試歷年參考題庫附帶答案詳解
- 《環(huán)境污染對生態(tài)系統(tǒng)的影響》課件
- 年度得到 · 沈祖蕓全球教育報(bào)告(2024-2025)
- 2025年日歷表(A4版含農(nóng)歷可編輯)
評論
0/150
提交評論