Последовательный при сопоставлении массива с обещанием в javascript

#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. Я отредактировал сообщение, возможно, более понятно, как будут передаваться результаты. Вы можете передавать все, что хотите, в задачи с помощью аргументов. Ожидание будет оцениваться изнутри.