2015-10-21 99 views
0

如何從httpBackend.when()返回承諾?我想加載存儲在.json文件中的一些罐頭數據,並從httpBackend.whenGET()返回。當我嘗試從http.get('mydata.json')返回承諾時,響應返回到工廠的失敗回調。httpBackend.when()的角度返回承諾()

function getAvailablePackagesComplete(response) { 
    return response.data; 
} 

function getAvailablePackagesFailed(error) { // {error = Object {data: undefined, status: 0, config: Object, statusText: ""} 
    $log.error(error.data.description); 
    return false; 
} 

function getAvailablePackages() { 
    return $http.get('/1.0/get-available-packages') 
    .then(getAvailablePackagesComplete) 
    .catch(getAvailablePackagesFailed) 
} 


var data = {"package": "test", "version": "1"} 
$httpBackend.whenGET('/1.0/get-available-packages').respond(function(method, url, data) { 
    // return [200,data, {}] // this works 
    return $http.get('app/home/fixtures/mydata.json'); // contains {"package: "test", "version": "1"} 
}); //this doesn't work 

回答

0

因爲它目前,$ httpBackend是(從ngMockE2E)做內支持承諾其.respond - 見AngularJS GitHub Issue #11245。由於$httpBackend應該用於避免發出真正的HTTP請求,但可以讓一些請求通過。

AngularJS Docs

該實現可以用於通過靜態或動態響應來作出響應時API及其快捷方式(whenGET,whenPOST等)和任選通過請求到實際$ httpBackend用於特定請求(例如,與某些遠程apis交互或從Web服務器獲取模板)。

要解決你想要雖然做什麼,你可以嘗試有getAvailablePackages()返回HTTP GET爲您的JSON文件的路徑和定義$httpBackend.whenGET('pathTo.json').passThrough();

+0

我想保持從請求分離模擬後端,這樣我就可以直接刪除模塊的依賴性,當實際的API準備好了。所以,我認爲我必須在模擬後端模塊中硬編碼數據。 – neridaj

0

我被擊中了同樣的問題,我使用案例是在JS中構建了我的整個API的模擬,以便其他人可以脫機工作並開發UI。

爲了實現這個功能,我開發了一個名爲angular-mocks-async的插件,它用於裝飾httpBackend並向它添加.whenAsync()APi。比你可以輕鬆模擬響應和回報的承諾,像這樣:

var app = ng.module('mockApp', [ 
    'ngMockE2E', 
    'ngMockE2EAsync' 
]); 

app.run([ '$httpBackend', '$q', function($httpBackend, $q) { 

    $httpBackend.whenAsync(
     'GET', 
     new RegExp('http://api.example.com/user/.+$') 
    ).respond(function(method, url, data, config) { 

     var re = /.*\/user\/(\w+)/; 
     var userId = parseInt(url.replace(re, '$1'), 10); 

     var response = $q.defer(); 

     setTimeout(function() { 

      var data = { 
       userId: userId 
      }; 
      response.resolve([ 200, "mock response", data ]); 

     }, 1000); 

     return response.promise; 

    }); 

}]);