求教:new Promise 和 async可以混用么?
求教,new Promise 和 async可以混用么?需求是要把多个await封装成一个新的功能,方便外部调用使用,像下面这样调用有什么隐患么?如果能用,哪种方式好?(上传不了图片,一上传谷歌浏览器就崩溃)
方式一:async写在new promise括号里
return new Promise(async(resolve, reject) => {
try {
let ttlRe = await redisApply.redisGetTTL(key);
if (ttlRe.message == -1 || ttlRe.message == -2 || !ttlRe) {
console.log('过期重新生成:' + ttl)
let zz = await redisApply.redisKeySet(key, value, ttl)
resolve({a: zz});
}else {
resolve({a: 's'});
}
} catch (err) {
console.log('出错了:' + err);
reject(err);
}
});
方式二:async写在代码里
```js\n
return new Promise((resolve, reject) => {
(async () => {
try {
let ttlRe = await redisApply.redisGetTTL(key);
if (ttlRe.message == -1 || ttlRe.message == -2 || !ttlRe) {
console.log('过期重新生成:' + ttl)
let zz = await redisApply.redisKeySet(key, value, ttl)
resolve({a: zz});
} else {
resolve({a: 's'});
}
} catch (err) {
console.log('出错了:' + err);
reject(err);
}
})();
})
}
7 回复
直接 return async 函数就好了,async 函数返回的就是累 promise 的对象。同时 await 来同步调用的也就是 promise 类对象。
回到标题。async 本来就是基于 promise 的。
楼主对Promise和async的理解可能还差点
return async function () {
try {
let ttlRe = await redisApply.redisGetTTL(key)
if (ttlRe.message == -1 || ttlRe.message == -2 || !ttlRe) {
console.log('过期重新生成:' + ttl)
let zz = await redisApply.redisKeySet(key, value, ttl)
return ({a: zz})
} else {
return {a: 's'}
}
} catch (err) {
console.log('出错了:' + err)
throw err
}
}
这样就可以了:D
补充一点,async函数中throw后,作用等价于Promise.reject()哈,你在外部可以把上面这个匿名的async函数当做promise用,也可以当作async函数使用。两者是等价的
哦另外推荐这么写:
return async function () {
try {
let ttlRe = await redisApply.redisGetTTL(key)
// here,你的代码备注!
if (ttlRe.message != -1 && ttlRe.message != -2 && ttlRe) {
return {a: 's'}
}
console.log('过期重新生成:' + ttl)
let zz = await redisApply.redisKeySet(key, value, ttl)
return ({a: zz})
} catch (err) {
console.log('出错了:' + err)
throw err
}
}
@lellansin 十分感谢
@Bingmang 受教了,讲的太详细了,之前一直迷糊Promise和async之间的关系…
@lellansin 麻烦在问一下:是不是下面这样?萌新,怕自己理解错了哈…
test: async function(key, value, ttl){
try {
let ttlRe = await redisClient.redisGetTTL(key)
// here,你的代码备注!
if (ttlRe.message != -1 && ttlRe.message != -2 && ttlRe) {
return ({a: ttlRe});
}
console.log('过期重新生成:' + ttl)
let zz = await redisClient.redisKeySet(key, value, ttl)
return ({a: '过期重新生成'})
} catch (err) {
console.log('出错了:' + err)
throw err
}
} \n``` 标记代码块