2016-08-08 4 views
1

Я программирую новое обещание, оно имеет множество различных условий, которые вызывают reject() или resolve(), связанные с их состоянием, также я знаю, что состояние обещания будет установлено с первого вызова reject() | resolve(). Мой вопрос: Есть ли какой-нибудь родной (встроенный) способ получить состояние обещания? Ниже демонстративный-код:Как проверить это состояние обещания при программировании нового обещания? js

exports.addStatement = function (db, description, data) { 
    return new Promise(function (resolve, reject) { 
     validator.validateStatement(description, data) 
     .then(function (data) { 
      //...... 
      if(cnd1) 
       resolve(res); 
      if(cnd2) 
       reject(err); 
      //...... 
      //How to check if this promise is rejected or resolved yet? 

     }) 
     .catch(function (err) { 
      reject(err); 
     }) 
    }) 
}; 
+0

Это не то, как обещают работу. Похоже, вы пропустили всю концепцию обещаний. Вы можете использовать 'then()' и 'catch()', только после того, как обещание было возвращено из функции – Roysh

+0

новое состояние Promise связано с внутренним обещанием, оно работает. –

+1

Два замечания. Почему бы вам просто не использовать 'if() {} else if() {} else {}' или просто 'return resolve();'? Таким образом, нет необходимости знать состояние обещаний вообще, и ваш код становится чище. И второе: почему вам даже нужно «новое обещание», когда 'validator.validateStatement' уже возвращает обещание? – str

ответ

2

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

Возможно, вы можете изменить способ структурирования вашего кода, чтобы удалить anti-pattern, чтобы создать ненужное внешнее обещание и переключить свою логику на if/else if/else.

Вот очистили код:

exports.addStatement = function (db, description, data) { 
    return validator.validateStatement(description, data) 
     .then(function (data) { 
      //...... 
      if(cnd1) { 
       // make res be the resolved value of the promise 
       return res; 
      } else if(cnd2) { 
       // make promise become rejected with err as the reason 
       throw err; 
      } else { 
       // decide what else to do here 
      } 
     }) 
    }) 
}; 

Если вы не могли бы сделать, если/еще работать для вас, выше структура должна еще работать, потому как return и throw прекратить выполнение .then() обработчик. Таким образом, единственный код, который продолжается после них, - это код, который еще не установил разрешенное/отклоненное значение для текущего обещания, поэтому вам не нужно смотреть на состояние обещания знать это. Если код прошел мимо return и throw и все еще выполняется, то ни один из них не был выполнен, а разрешенное/отклоненное значение текущего обещания все еще не установлено.

+0

Спасибо за ваш ответ, я меняю свой путь и удаляю строку 'new Promise()', но она терпит неудачу, я думаю, что точка - это первая 'обещание. Then' запускает асинхронный код, поэтому второй' prom.then' будет вызываться с неопределенным аргументом. –

+0

@RezaAfzalan - вполне приемлемо связывать обещания и '.then()' обработчики всегда называются асинхронно. Обещания - это пули для этой ситуации. Вам нужно будет показать больше вашего реального кода (вместо этого псевдокода), чтобы мы могли вам помочь. Направление концептуально корректно. Нам нужно увидеть ваш фактический код, чтобы узнать, что еще вы делаете неправильно. – jfriend00

+0

Да, вы можете проверить его: https://github.com/DANA-Laboratory/modproject/blob/refactory/app/models-sqlite3/LearningX/statement.js#L57 –

Смежные вопросы