Estoy usando una API tranquila y necesito publicar algunos datos. pero antes, necesito asegurarme de que la mesa esté vacía. El problema al que me enfrento es que el método de eliminación de esta API devuelve el éxito, pero no elimina los datos de inmediato, estos datos se envían a una cola para eliminarlos lo antes posible.
Entonces, antes de llamar al método de publicación, necesito verificar si tengo algún elemento en esta tabla. ¿Cómo puedo llamar a este método varias veces para asegurarme de que el método de publicación solo se ejecutará cuando la tabla esté vacía?
async function run() { apiDelete() .then(() => console.log('deleting')) .then(() => { getItems(). then(() => { apiPost() .then(() => console.log('posting...')) .catch(e => console.log(e)) }) }) .catch(e => console.log(e)) return }Los métodos:
async function apiPost() { const url = 'https://apipost.com/data/v2/1234' const options = { method: 'POST' } return (await fetch(url, options)).json() } async function apiDelete() { const url = 'https://apidelete.com/data/v2/all' const options = { method: 'DELETE', } return (await fetch(url, options)).json() } async function getItems() { const url = 'https://apiget.com/data/v2/all' const options = { method: 'GET', } return (await fetch(url, options)).json() }Debe realizar una llamada recursiva con una condición de salida que le solicite salir cuando el número de elementos sea 0.
Una forma podría ser algo como esto:
async function deleteUntilEmpty() { await apiDelete(); const items = await getItems(); if (items.length) { return deleteUntilEmpty(); } } async function run() { await deleteUntilEmpty(); apiPost() .then(() => console.log("posting...")) .catch((e) => console.log(e)); }En lugar de eliminar constantemente, también puede hacer una encuesta para ver si el servidor ha completado la eliminación original:
async function pollUntilEmpty() { const items = await getItems(); if (items.length) { // this could be a good spot to introduce some kind of // sleep to not DDOS your server ;) return pollUntilEmpty(); } } async function deleteAndPollUntilEmpty() { await apiDelete(); await pollUntilEmpty(); } async function run() { await deleteAndPollUntilEmpty(); apiPost() .then(() => console.log("posting...")) .catch((e) => console.log(e)); }