es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Patrón Anti-Javascript – Devolver una nueva Promesa desde una función asíncrona.

¿Se considera un anti-patrón devolver una Promesa creada manualmente desde una función asíncrona?

Dado que las funciones asíncronas devuelven promesas por defecto, es un poco extraño construir una nueva Promesa y devolverla desde la misma función asíncrona.

Tengo dos métodos diferentes, en el primero, tengo dudas sobre si estoy haciendo o no el anti-patrón del constructor nuevo de Promesas. En el otro, estoy seguro de que es un anti-patrón.

Primera función:

export default async (uri) => {
const blob = await new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();

xhr.onload = function () {
  resolve(xhr.response);
};

xhr.onerror = function (e) {
  reject(new TypeError("Network request failed"));
};

xhr.responseType = "blob";
xhr.open("GET", uri, true);
xhr.send(null);

});

return blob;
};

Segunda función:

export async function uploadImageToStorage(
imageUri,
storageFolder = “images”,
stateObserver = undefined
) {
const blob = await uriToBlob(imageUri);

const imageId = blob._data.blobId;

const storageRef = storage.ref(storageFolder).child(imageId);

return new Promise((resolve, reject) => {
storageRef.put(blob).on(
“state_changed”,
stateObserver,
function error(err) {
blob.close();
reject(err);
},
function complete() {
blob.close();
resolve(imageId);
}
);
});
}

¿Se considera un anti-patrón la implementación del primer método?

En la segunda función, como storageRef.put(blob).on() no devuelve una Promesa, mi API es de devolución de llamada, necesito envolverla en una Promesa, resolviendo en un callback complete(). Si lo refactorizo a:

export async function uploadImageToStorage(
imageUri,
storageFolder = “images”,
stateObserver = undefined
) {
const blob = await uriToBlob(imageUri);

const imageId = blob._data.blobId;

const storageRef = storage.ref(storageFolder).child(imageId);

await new Promise((resolve, reject) => {
storageRef.put(blob).on(
“state_changed”,
stateObserver,
function error(err) {
blob.close();
reject(err);
},
function complete() {
blob.close();
resolve(imageId);
}
);
});

return imageId;
}

¿La nueva implementación no se consideraría un anti-patrón, verdad?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Devolver una Promesa creada manualmente en una función asíncrona no resuelta generalmente se considera una mala práctica. En la primera función, no está claro si es o no una mala práctica, ya que no está claro cuál es el propósito del constructor new Promise. En la segunda función, definitivamente es una mala práctica, ya que storageRef.put(blob).on() no devuelve una Promesa, y la API basada en callbacks debe envolverse en una Promesa. Refactorizar la segunda función para usar await new Promise en lugar de return new Promise no se consideraría una mala práctica.

Comments are closed.