Как я могу использовать prom.all с использованием вставки mysql в каскадный стиль?

Vahagn Aleksanyan спросил: 13 июня 2018 в 09:50 в: javascript

Я хочу вставить таблицу данных 3, используя обещание, и у меня есть проблема. Я хочу вставить данные в таблицу задач, получить результат insert id, вставьте этот идентификатор в другую таблицу и получите этот идентификатор вставки, вставьте этот идентификатор другой таблицы. Я хочу сделать это с помощью функции Promise.all.Это мой код.

addClientTable(insertTask)
    .then(client_res => {
        return client_res.insertId;
    })
    .then(clientInsId => {
        insertTask.task.client_id = clientInsId;
        addTaskTable(insertTask)
            .then(task_res => {
                if (insertTask.task.connection == 0) {
                    updateTaskConnection(task_res.insertId)
                        .then(res => {
                            console.log(res);
                        })
                        .catch(err => {
                            console.log(err);
                        })
                }
                return task_res.insertId;
            })
            .then(taskInsId => {                addTaskUsersTable(user_ids, taskInsId, clientInsId)
                    .then(result => {
                        resolve(result);
                    })
            })
            .catch(err => {
                reject(err);            })
    })
    .catch(err => {
        reject(err);
    });

2 ответа

Есть решение
Taki ответил: 13 июня 2018 в 10:03

Я не вижу необходимости в Promise.all, но для более чистого кода и избегаю вложенного .then(), я бы предложил async/await, сладкий синтаксис для обещаний, ваш код должен выглядеть так:

async function myFn (){
  const clientInsId = await addClientTable(insertTask).insertId;  insertTask.task.client_id = clientInsId;  const task_res = await addTaskTable(insertTask);
  let res;  if (insertTask.task.connection == 0) {
    res = await updateTaskConnection(task_res.insertId);
    console.log(res);
  }  const result = await addTaskUsersTable(user_ids, taskInsId, clientInsId);  return result;
};myFn()
  .then(data => console.log(data))
  .catch(err => console.log(err))
David784 ответил: 13 июня 2018 в 10:21
Вы можете использовать один Promise.all, для addTaskUsersTable и updateTaskConnection (если выполняется второй). Просто создайте массив с вызовом addTaskUsersTable, затем if...array.push(...) для updateTaskConnection, затем let [result, res] = await Promise.all(array);
Rocode ответил: 13 июня 2018 в 05:20

Любое возвращение из обещания тогда возможно.

Исходя из этого, вы также можете изменить свой код, чтобы он выглядел ниже.

addClientTable(insertTask)
    .then(client_res => {
        return client_res.insertId;
    })
    .then(clientInsId => {
        insertTask.task.client_id = clientInsId;
        return addTaskTable(insertTask)
    })
    .then(task_res => {
        if (insertTask.task.connection == 0) {
            updateTaskConnection(task_res.insertId)
                .then(res => {
                    console.log(res);
                })
                .catch(err => {
                    console.log(err);
                })
        }
        return task_res.insertId;
    })
    .then(taskInsId => {
        return addTaskUsersTable(user_ids, taskInsId, clientInsId)
    })
    .then(result => {
        resolve(result);
     })
    .catch(err => {
        reject(err);
    });

использование async / await было бы возможным.