2015-01-20 7 views
2

У меня есть функция, которая может возвращать обычный объект или объект запроса http.Как вернуть объект в моем случае?

У меня есть что-то вроде

var t = function() { 
    var obj 
    var test; 
    //code to determine test value 

//return object depends on test value, 
//if test is undefined, return regular obj, 
//if not make a http request. 
    if (!test){ 
      return obj; 
    } 
    return getObj(url) 
     .then(function(obj){ 
      return obj 
     }) 
} 

var getObj = function() { 
    return $http.get(url);  
} 

var open = function() { 
    //this won't work for regular object, it has to be http object 
    return t() 
     .then(function(obj) { 
      return obj; 
     }) 
} 

var obj = open(); 

Как проверить, если возвращаемый объект через запрос HTTP или просто обычный объект?

Спасибо за помощь!

ответ

3

Если я правильно ваши понимаю проблема с объектом, возвращаемым t, является обещанием или не разрешать c HAINING. Вы всегда можете обернуть объект с помощью $q.when(obj), он убедится, что возвращаемый объект всегда является обещанием и может быть скован. Вы должны обязательно ввести $q так, как вы делаете $http. Или просто оберните значение теста var obj = $q.when(value) и return obj.

var t = function() { 
    var obj; 
    var test; 
    //code to determine test value 
    if (!test){ 
     return $q.when(obj); //<-- return $q.when 
    } 
    return getObj(url) 
     .then(function(obj){ 
      return obj 
     }) 
} 

var getObj = function() { 
    return $http.get(url);  
} 

var open = function() { 
    //this will always work now on 
    //return t(); should be enough as well 
    return t() 
     .then(function(obj) { 
      return obj; 
     }) 
} 

when(value):Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. This is useful when you are dealing with an object that might or might not be a promise, or if the promise comes from a source that can't be trusted.

+0

полностью работает благодаря! – BonJon

1

Вы можете проверить, является ли тип t функцией или объектом. Чтобы он был вызван, он должен быть введен как функция.

//this won't work for regular object, it has to be http object 
if(typeof t !== "function"){ 
//return; or handle case where t is a plain object 
} 
+0

Я предполагаю, что он говорит об объекте обещание и не объект посыла. В случае неопределенного объекта 't(), то()' invocation будет терпеть неудачу. – PSL

+0

@PSL - Да, я не знал, что такое намерение «открыть». Поскольку объект передается только оттуда, и поскольку он был первоначально настроен как '{}', возможно, имеет смысл просто передать 't' в этом случае снова, поэтому я попытался указать' // return; 'в этот ответ. С другой стороны, мне также нравится ваша идея обернуть объект в обещание, которое в этом случае, вероятно, является лучшей практикой. –

0

Вы можете проверить, есть ли возвращение объекта объект обещания или нет:

var open = function() { 
    var result = t(); 
    //Verify whether the return object has a promise object or not 
    if(angular.isObject(result.promise) 
    return result 
     .then(function(obj) { 
      return obj; 
     }) 
} 
+0

Вызов простого объекта даст вам 'Uncaught TypeError: object is not a function'. –

1

Модифицированного код

Передайте метод обратного вызова

var t = function(cb) { 
    var obj 
    var test; 
    //code to determine test value 

//return object depends on test value, 
//if test is undefined, return regular obj, 
//if not make a http request. 
    if (!test){ 
      cb(obj); 
    } 
    return getObj(url) 
     .then(function(obj){ 
      cb(obj) 
     }) 
} 

var getObj = function() { 
    return $http.get(url);  
} 

var open = function() { 
    //this won't work for regular object, it has to be http object 
    return t(function(obj) { 
      // write code dependent on obj 
     }) 
} 

var obj = open(); 
+0

Что делает cb делать? – BonJon

+1

Проблема с передачей обратного вызова заключается в том, что вы теряете преимущество обещаний и обещаний цепочки. – PSL