javascript - example - Devuelve una promesa vacía
promise ajax jquery (3)
¿Cómo puedo devolver una promesa vacía (o cualquiera que sea el objeto correcto que debo devolver en la situación)?
Sí, una "promesa vacía" es apropiada aquí, si te refieres a una promesa que ya se cumple con nada ( undefined
, null
).
La sintaxis de jQuery para crear tal está usando $.when
con un solo argumento (o no):
if (books <= 0) return $.when(null);
Tengo una función que devuelve una promesa jQuery. Se parece a esto:
addBooks(books: Array<Books>) {
return $.ajax({
url: ''/Books/AddBooks/'',
type: ''POST'',
data: ko.toJSON(books),
contentType: ''application/json''
});
}
Hago esto para poder reutilizar esta función y prometer devoluciones de llamada de cadena como:
addBooks.done(() => { alert("Books added!"); })
Mi pregunta es, ¿qué sucede si deseo salir de AddBooks antes y evitar un viaje al servidor? Por ejemplo:
addBooks(books: Array<Books>) {
// An empty array was passed in for some reason.
// Theres nothing to add so dont try to POST
if (books <= 0) return null;
return $.ajax({
url: ''/Books/AddBooks/'',
type: ''POST'',
data: ko.toJSON(books),
contentType: ''application/json''
});
}
Mi ejemplo no se compilará porque mi ejemplo de devolución de llamada encadenada espera que addBooks
devuelva un objeto de promesa, no nulo. ¿Cómo puedo devolver una promesa vacía (o cualquiera que sea el objeto correcto que debo devolver en la situación)?
Desde https://api.jquery.com/jquery.when/
Si no le pasa ningún argumento,
jQuery.when()
devolverá una promesa resuelta.
p.ej
if (books <= 0) return $.when();
y, si necesita un valor que no se transmita indefinidamente:
Si se pasa un solo argumento a jQuery.when () y no es un Aplazado o una Promesa , se tratará como un Aplazado resuelto y cualquier doneCallbacks adjunto se ejecutará de inmediato. Los doneCallbacks se pasan el argumento original.
por ejemplo, se pasa una matriz vacía:
if (books <= 0) return $.when([]);
Por ejemplo, se pasa un objeto vacío:
if (books <= 0) return $.when({});
Puedes devolver una promesa resuelta : en lugar de
if (books <= 0) return null;
utilizar
if (books <= 0) return $.Deferred().resolve();
Sin embargo, tenga en cuenta que la API Promise
de jQuery hace algo sorprendente: a veces llama a su servicio / then
/ etc. devolución de llamada de forma sincrónica con el done
/ then
/ etc. llamar, a veces no lo hace. La mayoría de las bibliotecas de promesas se aseguran de que la llamada sea siempre asíncrona, incluso si está llamando a done
/ then
/ etc. en una promesa resuelta. jQuery no, por lo que obtienes diferencias sutiles.
Por ejemplo, este código:
addBooks(() => console.log(1));
console.log(2);
... se registrará
2 1
... si hiciste la llamada ajax, pero
1 2
... si devolviste una promesa resuelta.