先說明图贸,我是個社會閑散人員,最近在做個微信小程序求妹,主要就是給學(xué)妹做畢設(shè)佳窑。我校的畢設(shè)要求很低制恍,大家見笑了。今天遇到個很大的坑净神,最后也是用了實際開發(fā)中萬一被項目老大看到有可能被暴打的方式解決了問題。
需求是從后臺拿一個openid鹃唯,然后查數(shù)據(jù)表有沒有記錄,如果沒有記錄的話就新增記錄瓣喊。這些都是云函數(shù)開發(fā),這是三次請求藻三。這個需求其實很簡單,問題在于我需要這三個操作順序執(zhí)行棵帽,在第二步查數(shù)據(jù)表的記錄的回調(diào)方法里面熄求,往數(shù)據(jù)表新增記錄的代碼總是出問題逗概,感覺是沒有執(zhí)行弟晚。于是開始著手解決這個問題逾苫。
推測:網(wǎng)絡(luò)請求的回調(diào)函數(shù)里面不能再發(fā)請求
這個推測其實很傻逼卿城,打斷點追查了一下就發(fā)現(xiàn)不是這個問題铅搓。回調(diào)里面可以再發(fā)請求(我個人的猜測是數(shù)據(jù)庫的回調(diào)方法里面不能再進行數(shù)據(jù)庫的操作狸吞。)
額外問題:嵌套地獄
當(dāng)我發(fā)現(xiàn)雖然沒跑通代碼勉耀,但是可讀性已經(jīng)很差蹋偏,并且連發(fā)三次請求確實嵌套太多(每次請求都寫在上一個請求的回調(diào)方法里)于是學(xué)習(xí)了一些promise風(fēng)格代碼便斥。正好改了一下我的代碼試試威始,呵呵枢纠,果然一樣沒成功黎棠。但是我并不氣餒晋渺,起碼學(xué)到了知識。操tm的木西。
推測:可以通過修改云函數(shù)實現(xiàn)
其實第一步就是從后臺拿openid,這是個云函數(shù)八千。如果云函數(shù)里面可以獲取openid同時把數(shù)據(jù)庫的查詢結(jié)果一起返回(最好還能把插入操作也給解決咯)吗讶,那這個問題或許可以解決掉恋捆。然后去官方文檔學(xué)了一下語法照皆,失敗沸停。主要是覺得水個畢設(shè)而已膜毁,又不是專門搞小程序的愤钾,這么費力調(diào)試云函數(shù)不值得瘟滨。應(yīng)該再找個更簡單的方式绰垂。
推測:監(jiān)視變量來讓這些請求變成順序執(zhí)行的
其實這個想法很簡單室奏,設(shè)置一兩個變量做標(biāo)記劲装。比如設(shè)置倆變量:run_step2(可執(zhí)行第二步)胧沫,run_step3(可執(zhí)行第三步)占业,都是布爾類型绒怨。然后監(jiān)視倆變量谦疾。第一步的回調(diào)里面把step2設(shè)置成true南蹂,第二步的回調(diào)里面把step3設(shè)置成true念恍。然后監(jiān)視到這倆變量都是true的時候執(zhí)行第三步六剥。想法就是這樣峰伙。但是我遇到了別的問題……
1.照著官方文檔的寫法沒監(jiān)聽成功疗疟。我還去查了一下瞳氓,為什么官網(wǎng)的demo是component而小程序開始都是page策彤,page和component一起寫還報錯。還有人給我說單獨寫component再引入進來店诗。我覺得不是這個問題。還有人說page和component一樣用庞瘸,雖然我沒在查具體啥區(qū)別捧弃,但是監(jiān)聽的代碼寫在page里面也沒成功恕洲。
2.然后我想著有沒有簡單的方式實現(xiàn)原生js的監(jiān)聽塔橡。然后百度上給了我一堆vuejs里面watch的用法…淦霜第。后來找到了一個原生js實現(xiàn)watcher的博客,我看了一下泌类,略顯復(fù)雜,我這個沒學(xué)過js沒搞過前端的人理解起來略顯費勁底燎。主要是也不知道在小程序里效果咋樣……我就給人水個畢設(shè),為什么要這么為難我双仍。
最終:我選擇了不停獲取變量的值
其實還是和監(jiān)聽的原理一樣,只是監(jiān)聽代碼沒寫出來朱沃,于是有了這種想法苞轿。我發(fā)現(xiàn)js里面的interval和timeout用起來真tmd方便逗物,這肯定是為了處理我這種情況搬卒。欺騙自己ing翎卓,改bug主要是控制變量法契邀。
現(xiàn)在再看看這段代碼失暴,真是被自己秀到了,為了水畢設(shè)人真是什么代碼都寫得出來逗扒。
這個status其實就代替了我剛才說的step1和step2了古戴,多寫了幾個狀態(tài)缴阎。我感覺自己對這種開發(fā)真的愛不起來允瞧,給別人水完畢設(shè)就告別小程序了。困死我了述暂,頭疼,晚安畦韭。