求教:new Promise 和 async可以混用么? - CNode技术社区

求教:new Promise 和 async可以混用么?
发布于 7 年前 作者 iori2882 7769 次浏览 来自 问答

求教,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``` 标记代码块
回到顶部

AltStyle によって変換されたページ (->オリジナル) /