react promise 中加/不加函数大括号的影响原理
在 react 中,使用 promise 进行异步操作时,我们经常会遇到在函数前面加上或不加上大括号的情况。这两种写法产生不同的效果,让人迷惑。
问题:有无大括号的区别
下面展示了两种写法的对比:
正确写法(无大括号):
get: () => new promise((resolve) => {...})
错误写法(有大括号):
get: () => { new promise((resolve) => {...}) }
这两种写法的区别在于,无大括号的写法将 new promise 作为函数的返回值。而有大括号的写法,会将函数进一步包装一层,导致无法访问 promise 的 resolve 函数。
原理解释
当使用无大括号时,get 函数直接返回一个 promise 实例。而当添加大括号时,则创建一个匿名函数,此函数返回 promise 实例。在第二种写法中,匿名函数的返回值被 discard 掉,无法访问 resolve 函数。因此,get 函数实际上没有返回 promise,导致异步操作失败。
示例
以下是包含这两种写法的代码示例:
const getdata = async () => { // ... } useeffect(() => { currentref.current = { get: () => new promise((resolve) => { // 正确写法 getdata().then((res) => { // ... resolve({ ... }); }).catch((error) => { if (error && error.errorfields) { // ... } }); }) }; }, []);
const getData = async () => { // ... } useEffect(() => { currentRef.current = { get: () => { // 错误写法,无法访问 resolve 函数 new Promise((resolve) => { getData().then((res) => { // ... resolve({ ... }); }).catch((error) => { if (error && error.errorFields) { // ... } }); }); } }; }, []);
因此,在 react 中使用 promise 时,请确保省略函数大括号,以正确返回 promise 实例并实现异步操作。