Обещание вопроса улова - PullRequest
0 голосов
/ 06 июля 2019

Попробуйте использовать Promises в моем приложении на node.js.Но столкнулся с проблемой.

Возможно ли для catch() получить applicationObject (только что созданный в then())?

Как передать applicationObject в catch()?

Ошибка может быть вызвана любыми случаями - принудительным выбросом в любом месте приложения, ограниченном execute(), или системной ошибкой.

Пример кода:

new Promise((resolve, reject) => {
    // Create applicationObject (used a Singleton pattern)
    let applicationObject = Application.getInstance();
    resolve(applicationObject);
})
.then(applicationObject => {
    // Working with applicationObject
    applicationObject.dbModel.beginTransaction();
    applicationObject.execute();
    applicationObject.dbModel.commit();
})
.catch(error => {
    // In any error case try to make some actions with this object
    // including rollback db changes
    applicationObject.dbModel.rollback(); // How to get applicationObject?
    ...
}

Ответы [ 2 ]

1 голос
/ 06 июля 2019

Если ошибка происходит внутри библиотеки, нет способа получить applicationObject в .catch().Если вы хотите использовать applicationObject в .catch(), вы должны оставить объект вне Promise.

let applicationObject;

new Promise((resolve, reject) => {
    applicationObject = Application.getInstance();
    resolve(applicationObject);
})
.then(applicationObject => {
    applicationObject.dbModel.beginTransaction();
    applicationObject.execute();
    applicationObject.dbModel.commit();
})
.catch(error => {
    if (!applicationObject) {
      // In this case, the error occured while creating applicationObject, so you should not call application.dbModel or something.
      return;
    }

    // In this case applicationObject created successfully, and the error occured while executing dbModel issue.
    // You should call rollback or something here.
    applicationObject.dbModel.rollback();
    ...
}
1 голос
/ 06 июля 2019

Во-первых, если это Синглтон, то вы можете просто вспомнить Application.getInstance() внутри улова, если он реализован правильно, то это не должно иметь никаких дополнительных затрат.

Либо просто создайте его вне Обещания, например,

 let applicationObject = Application.getInstance();
 new Promise((resolve, reject) => {
   ...
 })
 .catch(err => {
   // applicationObject is accessible
 })

Или, если он имеет , который будет создан Обещанием, просто создайте переменную вне Обещания, т.е.

let applicationObject = null;
new Promise((resolve, reject) => {
  applicationObject = Application.getInstance();
  ...
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...