Лямбда-функция, возвращающая обещание от неработающей функции - PullRequest
1 голос
/ 13 февраля 2020

Я работаю над лямбда-функцией, используя node js. Я вызываю функцию, которая возвращает обещание, а затем вызываю обещание. Моя первая функция получает БД в виде строки на основе идентификатора. Если строка отсутствует, я хочу вернуть ответ об ошибке, и, если она есть, она должна вызвать promise.

Ниже приведен мой код:

return getDetailsOfRow(id).then(function() {
    return Promise.all([
        getDetailsOfA(query1), 
        getDetailsOfB(query2), 
        getDetailsOfC(tripLocationsQuery)
    ]).then(function(values) {
        return combineResults();
    })
});

function getDetailsOfRow(trip) {
    return new Promise((resolve, reject) => {
        con.query(query, id, (err, results, fields) => {
            if (err) {
                reject(err);
            }
            if (results.length < 1) {
                createErrorResponse();
            } else {
                //get the set column values to use for other function   
            }
        });
    });
}

function createErrorResponse() {
    return new Promise((resolve, reject) => {
        var response = {
            "isBase64Encoded": false,
            "statusCode": 404,
            "headers": {
                "Content-Type": "text/html"
            },
            "body": "Invalid Key"
        };
        resolve(response);
    });
}

Обещание внутри метода createErrorResponse не вызывается для лямбда-функции. Я не получаю никакого ответа от лямбда-функции. Я не нашел никакого решения. Это потому, что я верну обещание внутри обещания, если вызов createErrorResponse () из getDetailsOfRow ()?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вам не нужно заключать в обещание функцию createErrorResponse.

Добавьте createErrorResponse() в разрешении или отклонении и добавьте блок catch в getDetailsOfRow, чтобы поймать ошибку.

Попробуйте это


return getDetailsOfRow(id).then(function() {
  return Promise.all([
    getDetailsOfA(query1),
    getDetailsOfB(query2),
    getDetailsOfC(tripLocationsQuery)
  ]).then(function(values) {
    return combineResults();
  }).catch( error => {
     return error;
  });
});

function getDetailsOfRow(trip) {
  return new Promise((resolve, reject) => {
    con.query(query, id, (err, results, fields) => {
      if (err) {
        reject(err);
      }
      if (results.length < 1) {
        reject(createErrorResponse());
      } else {
        //get the set column values to use for other function
      }
    });
  });
}

function createErrorResponse() {
  return {
    isBase64Encoded: false,
    statusCode: 404,
    headers: {
      "Content-Type": "text/html"
    },
    body: "Invalid Key"
  };
}

0 голосов
/ 13 февраля 2020

Я вижу две проблемы здесь

  • Вы заключаете код для createErrorResponse в обещание, которое не требуется.
  • Вы не решаете в методе getDetailsOfRow, поэтому выполнить обещание невозможно.

Код должен выглядеть следующим образом

return getDetailsOfRow(id).then(function() {
  return Promise.all([
    getDetailsOfA(query1),
    getDetailsOfB(query2),
    getDetailsOfC(tripLocationsQuery)
  ]).then(function(values) {
    return combineResults();
  }).catch( error => {
     return error;
  });
});

function getDetailsOfRow(trip) {
  return new Promise((resolve, reject) => {
    con.query(query, id, (err, results, fields) => {
      if (err) {
        reject(err);
      }
      if (results.length < 1) {
        reject(createErrorResponse());
      } else {
        resolve(results); // it should be resolved.
      }
    });
  });
}

function createErrorResponse() {
  return {
    isBase64Encoded: false,
    statusCode: 404,
    headers: {
      "Content-Type": "text/html"
    },
    body: "Invalid Key"
  };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...