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

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