Как обрабатывать ошибки в цепочке обещаний node.js и разрешать массив обещаний - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь правильно обработать ошибки / исключения для функции node.js ниже, не влияя на ее (а) синхронное выполнение.

В частности, я хочу убедиться, что база данных полностью очищена ("removeCustomer"), прежде чем начинать создавать новые данные для операторов SQL.

Проблема: Мне нужно разрешить обещания через helper.returnAPISuccess ('Успешно вставленные строки', пары, обратный вызов) где-нибудь ...

Однако, если я приковываю .then () к функции pair.map () , это нарушает общую синхронизацию, например, вместо каждого результата, созданного .map, возвращается только первая строка.

Может быть, я мог бы попробовать Promise.all ()? Я думаю, что мне нужно добавить все "пары" в массив обещаний , разрешить их все и .then (helper.returnAPISuccess ... и т. Д.? Или я должен попытаться сгладить вложенные обещания ...?

функция обновления клиента:

updateCustomer(email, body, callback) {
    // Delete old data before creating new data for the customer
    helper.removeCustomer(this.db, email, callback)
    .then(() => {
        // Query to find category/item pairs
        let sql =`SELECT key as category, json_array_elements_text(value::json) as item
                FROM json_each_text($1:csv)`;
        this.db.queries.any(sql, [body])
        .then(pairs => {
            const insert =`INSERT INTO purchases_table(item, category, email_address)
                        VALUES($1, $2, $3)`;
            // Map each pair to the customer's email and insert into the purchases table
            pairs.map(pair => {
                this.db.queries.none(insert, [pair['item'], pair['category'], email])
                    .catch(error => {
                        helper.returnAPIError(error, 'Error inserting customer data', callback);
                    });
                })
        })
        .catch(error => {
            helper.returnAPIError(error, 'Error retrieving category/item pairs', callback);
        });
    })
    .catch(error => {
        helper.returnAPIError(error, 'Error removing old customer data', callback);
    });
}

Любая помощь будет принята с благодарностью, спасибо:)

Помощники:

removeRecipient:

module.exports.removeRecipient = (db, email) => {
  let sql = `DELETE FROM purchases_table WHERE email_address=$1`;
  return db.queries.result(sql, [email]);
}

returnAPISuccess:

module.exports.returnAPISuccess = (msg, data, callback) => {
  const response = {
    statusCode: 200,
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Credentials": true,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ message: msg, data: data })
  };
  callback(null, response);
}

1 Ответ

0 голосов
/ 08 мая 2019

Может быть, я мог бы попробовать Promise.all ()? Я думаю, что мне нужно добавить все «пары» в массив обещаний, разрешить их все и .then (helper.returnAPISuccess ... и т. Д .?

Да, это правильный путь.

Или я должен попытаться сгладить вложенные обещания ...?

Тебе тоже следует это сделать. И, что еще важнее, было бы неплохо вообще не вызывать какой-либо параметр callback, а вместо этого возвращать обещание из updateCustomer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...