@aimpmario

Reject из switch. Лог есть reject'a нет. Как выполнить reject из switch?

Уважаемы гуру, возможно кто-нибудь сможет ответить мне на вопросы.

return new Promise(function(resolve, reject){
      
      Object.keys(schemaPaths).forEach(function(path){        
        switch(schemaPaths[path].instance){
          case 'String' :
            cs(schemaPaths[path], data[path]).catch(function(e){
              console.error(e);
              reject(e);
            }); 
          break;
            
          default : 
              reject('default');
              break;
        };
      });
    
      resolve()
 });

Функция csвозвращает Promise, точнее Promise.reject(). Далее она выводит в консоль ошибку и делает дальше reject.
Проблема начинается здесь. Лог в консоль записывается, а reject выполняется не внутри case 'String' :, a почему-то сначала переходит в default. и там уже выполнит reject().
Это был вопрос №1.
Дальше больше. Если убрать
default : 
              reject('default');
              break;
};


Останется вот такая штука:

return new Promise(function(resolve, reject){
      
      Object.keys(schemaPaths).forEach(function(path){        
        switch(schemaPaths[path].instance){
          case 'String' :
            cs(schemaPaths[path], data[path]).catch(function(e){
              console.error(e);
              reject(e);
            }); 
        };
      });
    
      resolve()
 });


И тут тоже самое, (Лог -- есть, reject -- нет ). Только на этот раз выполниться resolve().

Переписал всё на If-Else всё работает как надо.Но вопрос остался, а решения нет.

Возможно кто-нибудь знает с чем связано такое поведение, и как это можно вылечить?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
return new Promise(function(resolve, reject){
      
      Object.keys(schemaPaths).forEach(function(path){        
        switch(schemaPaths[path].instance){
          case 'String' :
            return cs(schemaPaths[path], data[path]).catch(function(e){
              console.error(e);
              reject(e);
            }); 
          break;
            
          default : 
              return reject('default');
              break;
        };
      });
    
      resolve()
 });

UPD. Видать поздний час сказывается, невнимательно прочитал код.
function wtf(){   
      var promise;   
      Object.keys(schemaPaths).forEach(function(path){        
        switch(schemaPaths[path].instance){
          case 'String' :
            if(!promise){ 
              promise = cs(schemaPaths[path], data[path]).catch(function(e){
                console.error(e);
                return Promise.reject(e);
              });
            }  
          break;
            
          default : 
              if(!promise) promise = Promise.reject('default');
              break;
        };
      });
    
      return promise;
}

Но это в целом какой-то бред. Что этот код делает? Действительна будет только первая итерация по Object.keys(schemaPaths[path]), потому что после нее в любом случае promise будет уже установлен и все остальные итерации впустую.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы