2017-03-28 3 views
0

이 같은 JSON-RPC 공급자 (바벨과 웹팩과 transpiled)이 있습니다아마도 처리되지 않은 거부

export default function() { 
    var id = 1; 
    function request(method, params) { 
     return JSON.stringify({ 
      id: id++, 
      method: method, 
      params: params || [] 
     }); 
    } 
    var uri; 
    this.setup = function(user_uri) { 
     uri = user_uri; 
    }; 
    this.$get = ['$http', '$q', function($http, $q) { 
     function rpc(method, params) { 
      return $http({ 
       method: 'POST', 
       url: uri, 
       data: request(method, params) 
      }).then(response => response.data); 
     } 
     var defer = $q.defer(); 
     rpc('system.describe').then(data => { 
      var service = {}; 
      data.result.procs.forEach(spec => { 
       service[spec.name] = function(...args) { 
        var defer = $q.defer(); 
        if (args.length == spec.params.length) { 
         return rpc(spec.name, args).then(data => { 
          if (data.error) { 
           defer.reject(data.error); 
          } else { 
           defer.resolve(data.result); 
          } 
         }); 
        } else { 
         defer.reject('Invalid arity expected ' + 
            spec.params.length + 
            ' got ' + 
            args.length); 
        } 
        return defer.promise; 
       }; 
      }); 
      defer.resolve(service); 
     }); 
     return defer.promise; 
    }]; 
}; 

을 나는 하나의 함수 호출

 service.login('user', 'password').then(function(token) { 
      if (token) { 
       localStorage.setItem('notes_token', token); 
       localStorage.setItem('notes_username', 'user'); 
      } 
      console.log('token: ' + token); 
     }).catch(function(error) { 
      console.log(error); 
     }); 

을 요청이 오류를 반환하고 난 콘솔이있어 :

토큰 : 정의되지 않은 가능성이 처리되지 않은 거부 [잘못]을 : 사용 내가 catch에서 CONSOLE.LOG를 얻을이없는 이유는 연구 활동

then은 실행되지?

나는 또한 시도했다 :

 service.login('user', 'password').then(function(token) { 
      if (token) { 
       localStorage.setItem('notes_token', token); 
       localStorage.setItem('notes_username', 'user'); 
      } 
      console.log('token: ' + token); 
     }, function(error) { 
      console.log(error); 
     }); 

과 같은 결과를 얻을 수 있습니다. 각도 1.6.3을 사용하고 있습니다.

+1

이 [지연 안티 패턴을] 피 사용하기를 원할 것입니다 (http://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and- 방법 피하는 그것!)! – Bergi

답변

0

deferred antipattern을 피하십시오! $q.defer()을 사용하지 마십시오. 함수가 결과 약속을 거부하면이를 무시합니다. 즉 unhandled rejection입니다.

당신은

this.$get = ['$http', '$q', function($http, $q) { 
    function rpc(method, params) { 
     return $http({ 
      method: 'POST', 
      url: uri, 
      data: request(method, params) 
     }).then(response => response.data); 
    } 
    return rpc('system.describe').then(data => { 
// ^^^^^^ 
     var service = {}; 
     for (const spec of data.result.procs) { 
      service[spec.name] = function(...args) { 
       if (args.length == spec.params.length) { 
        return rpc(spec.name, args).then(data => { 
         if (data.error) { 
          throw data.error; 
//       ^^^^^ 
         } else { 
          return data.result; 
//       ^^^^^^ 
         } 
        }); 
       } else { 
        return $q.reject('Invalid arity expected ' + 
//     ^^^^^^^^^^^^^^^^ 
           spec.params.length + 
           ' got ' + 
           args.length); 
       } 
      }; 
     } 
     return service; 
//  ^^^^^^ 
    }); 
}]; 
+0

"$ q.defer()를 사용하지 마십시오."- 미안하지만이 사실을 이해하지 못합니다. $ q.defer가 널리 사용됩니다. –

+0

최저 수준에서만 사용해야합니다. 비동기 함수를 호출하면'$ q.defer'가 필요하지 않습니다. 함수는 약속을 반환해야합니다. 수정할 수없는 함수의 경우에만 지연된 함수를 사용하는 래퍼를 작성해야합니다. 그리고 '$ q.defer'의 많은 사용법이 잘못되었습니다. – Bergi

관련 문제