封裝數(shù)據(jù)請(qǐng)求方法怔昨,這里的async await可以將異步順序把代碼執(zhí)行順序從上往下執(zhí)行挫酿,函數(shù)執(zhí)行時(shí),一旦遇到await就會(huì)返回芯义。等到觸發(fā)的異步操作完成(并且調(diào)用棧清空)哈垢,再接著執(zhí)行函數(shù)體內(nèi)后面的語(yǔ)句。
acync function fn () {
try {
let data = await api('請(qǐng)求數(shù)據(jù)')//api為封裝的異步請(qǐng)求方法
console.log(data)
} catch (e) {
console.error(e)
}
}
export const api = async (reqUrl, options) => new Promise((resolve, reject) => {
let token = uni.getStorageSync('token')
options = options || {}
let url2 = url
try {
uni.request({
url: url2 + reqUrl,
method: options.method || 'GET',
data: options.data,
header: {
token,
...options.header
},
success: ({data, statusCode}) => {
if (statusCode !== 200 && statusCode !== 304) {
console.log(statusCode)
let msg = '請(qǐng)求出錯(cuò)'
// 記錄日志
reject(msg)
}
let {code, data: res, desc} = data
if (code === '0') {
if (typeof res === 'string') {
// 記錄日志
resolve(JSON.parse(res))
} else {
// 記錄日志
resolve(res)
}
} else if (code === '-2') {
// 記錄日志
// 無(wú)效token
uni.removeStorageSync('token')
uni.redirectTo('/pages/auth/auth')//?tokenErr=true
} else if (code === '-3') {
// 記錄日志
reject(new Error(code))
} else {
// 記錄日志
reject(desc)
}
},
fail: err => {
// 記錄日志
reject(err)
}
})
} catch (e) {
reject(e)
}
})
眾所周知async/await是ES6 Generator 函數(shù)延展扛拨,基于Generator語(yǔ)法糖而實(shí)現(xiàn)的耘分。而async函數(shù),就是將generator函數(shù)的*換成async,將yield替換成await求泰。
function* g() {
var o = 1
yield o++;
var kk = yield o++;
console.log(kk,'被賦值的kk')
yield o++;
return 'ending';
}
var gen = g()
g(); // 返回一個(gè)對(duì)象 并不會(huì)執(zhí)行
gen.next()//執(zhí)行并返回第一個(gè)值a
gen.next(22)// kk = undefined
gen.next(33)//執(zhí)行并第二個(gè)值賦值kk = 33
Generator 函數(shù)必須有next才會(huì)觸發(fā)央渣,不然不會(huì)繼續(xù)執(zhí)行
在這里yield與return的區(qū)別異同點(diǎn)在于,都會(huì)返回值渴频,但是return會(huì)直接終止函數(shù)芽丹,而yield會(huì)迭代繼承上次的值,如果在next里面?zhèn)鲄⑼鞯敲磿?huì)重置上一個(gè)yield的值并返回
注意:yield語(yǔ)句只能用于function的作用域,如果function的內(nèi)部還定義了其他的普通函數(shù)暖庄,則函數(shù)內(nèi)部不允許使用yield語(yǔ)句聊替。
function* foo1() {
yield 'a';
yield 'b';
}
function* foo2() {
yield 'c';
yield* foo1();
yield 'd';
}
var gn = foo2()
gn.next()//c
gn.next()//a
gn.next()//b
Generator.prototype.return()
Generator除了next還有個(gè)return,這個(gè)是直接終止Generator并返回
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen();
console.log(g.next()); // { value: 1, done: false }
console.log(g.return('foo')); // { value: "foo", done: true }
console.log(g.next()); // {value: undefined, done: true}