Tuve que preguntar ya que no puedo encontrar una manera decente de resolverlo. He seguido el tutorial de Cómo resolver las promesas de JavaScript secuencialmente (una por una) pero aún no puede funcionar en mi situación después de modificarla.
Llamé a una consulta SQLite para obtener datos y obtener una matriz de datos como respuesta. Luego llamo a la función a para comenzar a esperar todo el otro proceso hasta que se complete este subproceso.
Ejemplo de respuesta: [{"TSTaskID": 1638938895}, {"TSTaskID": 1638945283}]
async function getUnsyncRecordFromLocal() { /// ... and the rest of the code send query to SQLite callTasks(resp); } const callTasks = async (response) => { const allPromise = Promise.all(response.map(async (_item) => { task1(_item) .then((resp1) => task2(resp1)) .then((resp2) => task3(resp2)) .catch(console.error); })) const lists = await allPromise; } const task1 = async (TSTaskID) => { return new Promise((resolve, reject) => { console.log('task1 done.', TSTaskID); resolve(TSTaskID) }) /** implementation */ }; const task2 = async (TSTaskID) => { return new Promise((resolve, reject) => { console.log('task2 done.', TSTaskID); resolve(TSTaskID) }) /** implementation */ }; const task3 = async (TSTaskID) => { return new Promise((resolve, reject) => { console.log('task3 done.', TSTaskID); resolve(TSTaskID); }) /** implementation */ };El registro al hacerlo de esta manera
LOG task1 done. 1638938895 LOG task1 done. 1638945283 LOG task2 done. 1638938895 LOG task2 done. 1638945283 LOG task3 done. 1638938895 LOG task3 done. 1638945283como quiero que se vea
LOG task1 done. 1638938895 LOG task2 done. 1638938895 LOG task3 done. 1638938895 LOG task1 done. 1638945283 LOG task2 done. 1638945283 LOG task3 done. 1638945283 Lo intenté de varias maneras usando la async function pero la tarea aún no se completó en secuencia. Me gusta la tarea 1, 2, 3 para el mismo número y la siguiente tarea con el mismo número. Porque necesito verificar con la base de datos del servidor y actualizar la tabla SQLite local. Por lo tanto, debe esperar a que finalice uno antes de continuar con el siguiente.
Ambas Promesas iniciales de la tarea 1 se activarán al realizar el mapeo. Debe esperar a que se complete el primero antes de comenzar el segundo. p.ej
const callTasks = async (response) => { const result = [] for(let i = 0; i < response.length; i++){ const current = response[i] try { const result1 = await task1() const result2 = await task2(result1) const result3 = await task3(result2) result.push(result3) } catch(e) { // catch here } } return result }