Обещание не разрешается даже после вызова resol () - PullRequest
0 голосов
/ 16 февраля 2020

Мой вопрос здесь может показаться немного повторяющимся. Но я не нашел ответа на stackoverflow, который может решить мою проблему.

Я возвращаю обещание от одной из моих функций. Обещание будет выполнено после получения некоторых данных из базы данных. И будет отклонен, если в таблице БД нет данных. Также я должен выполнить некоторую обработку извлеченных данных перед разрешением обещания, поэтому я использую обратные вызовы.

Мой фрагмент кода

return new Promise((resolve, reject) => {


            ResourceModel.getById(resource_ID).then((data) => {
                if (data.length > 0) {
                    console.log(data);
                    resolve(data);
                    console.log("Resolve Function Called");
                } else {
                    console.log("No data available");
                    reject(new Error("No data available"));
                }
            });
        });

ResourceModel.getById ()

static getById(id) {
        const _transaction = cds.transaction();

        return _transaction.run(SELECT.from(Resource).where({ ID: id }));
    }

cds.transaction() - это один из методов, предоставляемых SAP в рамках структуры cds.

Я ожидаю, что после успешного извлечения всех записей он должен вызвать предоставленный обратный вызов, где у меня есть логи обработки c записано и после обработки * вызывается resolve().

Я получаю данные в обратном вызове, могу распечатать Data available, и полученный объект данных завершается даже Promise Resolved на консоли. Но удивительно, что обещание не разрешается

Я могу сказать, что "обещание не выполняется", потому что это возвращенное обещание будет собрано в Promise.all() платформой (как указано в официальных документах - * 1022). *https://cap.cloud.sap/docs/node.js/api#service -перед ) и вернуть ответ после разрешения. Но я не получаю никакого ответа (ни успеха, ни неудачи). Почтальон остается в состоянии загрузка ... состояние навсегда.

Приведенный выше пример отлично работает с примером setTimeout().

где я ошибаюсь?

Ответы [ 2 ]

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

Прежде всего, добавьте .catch(), чтобы получить отклоненное значение.

function asyncOpr = () => { 
    return new Promise((resolve, reject) => {
        ResourceModel.getById(resource_ID).then((data) => {
                    if (data.length > 0) {
                        console.log(data);
                        resolve(data);
                        console.log("Resolve Function Called");
                    } else {
                        console.log("No data available");
                        reject(new Error("No data available"));
                    }
            }).catch(err => { /* handle error */ })
        });
  }

Причина, по которой вы можете не получить разрешенное значение, заключается в том, как вы используете эту функцию. Правильная реализация будет выглядеть следующим образом:

function foo() {
  asyncOpr().then( val => console.log(val))
            .catch( err => console.log(err))
}

Также смотрите использование async / await .

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

Я сталкивался с таким типом ошибки при выполнении вызовов API или получении данных из БД. Обычно проблема, связанная с несоответствием типов вызываемых ресурсов или заголовка, имеет неправильный тип возврата. Было бы хорошо иметь console.log в getById () и посмотреть, что происходит в трассировке стека.

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