¿Puede alguien explicarme la diferencia entre las dos líneas de código? En mi editor atom, el más bonito cambia el primero por el segundo.
(await fetchSearchResults(state.requestConfig, context))?.facilities ?? [] )y
await fetchSearchResults(state.requestConfig, context)?.facilities ?? [] )Las dos líneas no son iguales y cualquier cambio automático entre estas dos probablemente sea incorrecto.
Para simplificar, la diferencia es entre:
(await foo()).barawait foo() .bar : Debido a la precedencia del operador await , el segundo código ( await foo().bar ) hará lo siguiente:
foo()bar de propiedades de ellaawait ese valorQue se puede escribir como:
const functionResult = foo(); const result = await functionResult.bar; Mientras que el primer código usa el operador de agrupación () para cambiar el orden de las operaciones a:
foo()await ese valorbar de propiedades de ellaQue se puede escribir como:
const functionResult = await foo(); const result = functionResult.bar;Esto marca absolutamente la diferencia si la función devuelve una promesa:
function foo() { return Promise.resolve({ bar: "hello world" }); } async function main() { console.log( await foo() .bar); // undefined - `foo()` returns a promise and there is no `bar` property console.log((await foo()).bar); // "hello world" - since the promise resolves to { bar: "hello world" } } main(); También hace una diferencia si foo() es síncrono pero la propiedad bar es una promesa:
function foo() { return { bar: Promise.resolve("hello world") }; } async function main() { console.log( await foo() .bar); // "hello world" since the promise resolves to that string console.log((await foo()).bar); // Promise (check the browser console) } main(); La única vez que no hace una diferencia es si no hay un código asíncrono (lo que significa que la await probablemente no debería estar allí):
function foo() { return { bar: "hello world" }; } async function main() { console.log( await foo() .bar); // "hello world" console.log((await foo()).bar); // "hello world" } main();Prettier cambia todo para seguir las reglas dadas en un archivo de configuración de Prettier.
En su caso específico , (await fetchSearchResults(state.requestConfig, context)) es inútil, de ahí que Prettier lo elimine.
Mientras tanto, puede ser bastante importante en un contexto asíncrono clásico, como se explica en el comentario a continuación . Tal vez el encadenamiento opcional esté engañando de alguna manera a Prettier aquí, no estoy seguro.
La configuración predeterminada de Vue2 ESlint viene con plugin:vue/essential y eslint:recommended como valores predeterminados.
Aquí hay un enlace donde puede obtener más detalles de por qué.
Si es solo Prettier , verifique la parte de opciones de la documentación o un archivo de configuración .prettierrc en su proyecto (o superior).
No necesita esos corchetes siempre que no vaya a usar el resultado de la promesa inmediatamente después, como en el ejemplo a continuación.
(await fetchSearchResults(state.requestConfig, context))?.facilities ?? [] )?.someMethod()pero la línea ya se está haciendo bastante larga, por lo que probablemente sea mejor que asigne el resultado de la promesa a una variable.