#javascript
#javascript
Вопрос:
Я должен был спросить, так как я не могу найти достойный способ ее решения. Я следую руководству о том, как последовательно разрешать обещания JavaScript (один за другим), но все равно он не может работать в моей ситуации после того, как я ее изменил.
Я вызвал запрос SQLite для получения данных и получения массива данных в качестве ответа. Затем я вызываю функцию a, чтобы начать ожидание всего другого процесса до завершения этого подпроцесса.
Пример соотв: [{"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 */
};
Журнал при выполнении этого способа
LOG task1 done. 1638938895
LOG task1 done. 1638945283
LOG task2 done. 1638938895
LOG task2 done. 1638945283
LOG task3 done. 1638938895
LOG task3 done. 1638945283
Как я хочу, чтобы это выглядело
LOG task1 done. 1638938895
LOG task2 done. 1638938895
LOG task3 done. 1638938895
LOG task1 done. 1638945283
LOG task2 done. 1638945283
LOG task3 done. 1638945283
Я попробовал несколько способов, используя async function
, но задача все еще не выполнена последовательно. Например, задача 1, 2, 3 для того же номера и следующая задача с тем же номером. Потому что мне нужно проверить базу данных сервера и обновить локальную таблицу SQLite. Итак, нужно дождаться завершения одного, прежде чем перейти к следующему.
Ответ №1:
Оба начальных обещания task1 будут запущены при сопоставлении. Вам нужно дождаться выполнения первого, прежде чем даже начинать второе. например
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
}
Комментарии:
1. Впервые вижу подобное обращение. И если я получу другой параметр для передачи на основе задачи, как это сделать, используя ваше решение?
2. Я отредактировал сообщение, возможно, более понятно, как будут передаваться результаты. Вы можете передавать все, что хотите, в задачи с помощью аргументов. Ожидание будет оцениваться изнутри.