2014-09-27 37 views
2
function times() { 
    var deferred = $q.defer(); 

    var data = $http.get('https://bus.data.je/latest'); 

    data.success(function(_data) { 
    deferred.resolve(_data); 
    }); 

    data.error(function(error) { 
    deferred.reject(error); 
    }); 

    return { 
    all: function() { 
     return deferred.promise; 
    }, 

    timetable: function(type) { 
     _data = deferred.promise; 
     return _data.filter(function (el) { 
     el = el[0]; 
     return el.MonitoredVehicleJourney.DirectionRef == type; 
     }); 
    } 
    } 
} 

當任一返回功能查詢,它返回一個包含承諾函數(finallycatchthen),而不是解析值的對象。我該如何解決?AngularJS承諾返回對象,而不是解析值

+1

[避免延遲反模式!](https://stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid-it)提示:所有引用'deferred.promise'可以簡單地被'data'替代。 – Bergi 2014-09-27 19:04:04

+3

您無法同步獲得承諾的分辨率值。承諾仍然是異步的,你所能做的就是從他們那裏獲得另一個承諾。 – Bergi 2014-09-27 19:05:24

回答

4

你不知道。你要做的就是暴露自己的API的承諾爲基礎的:

function times() { 
    var deferred = $q.defer(); 

    var data = $http.get('https://bus.data.je/latest'); 

    data.success(function(_data) { 
     deferred.resolve(_data); 
    }); 

    data.error(function(error) { 
     deferred.reject(error); 
    }); 

    return { 
     all: function() { 
      return deferred.promise; 
     }, 

     timetable: function(type) { 
      return deferred.promise.then(function (data) { 
       return data.filter(function (el) { 
        el = el[0]; 
        return el.MonitoredVehicleJourney.DirectionRef == type; 
       }); 
      }); 
     } 
    } 
} 

,然後用它像這樣:

times.timetable().then(function (timetables) { /* work with the timetables here */ }); 

因爲像評論中指出,你不能做出承諾後同步事實。