0

你如何从 httpBackend.when() 返回一个承诺?我想加载一些存储在 .json 文件中的罐头数据并从 httpBackend.whenGET() 返回。当我尝试从 http.get('mydata.json') 返回承诺时,响应将返回到工厂的失败回调。

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
4

3 回答 3

0

目前,$httpBackend(来自 ngMockE2E)不支持其内部的承诺.respond- 请参阅AngularJS GitHub 问题 #11245。应该使用as$httpBackend 来避免发出真正的 HTTP 请求,但您可以让一些请求通过。

来自AngularJS 文档

此实现可用于通过 when api 及其快捷方式(whenGET、whenPOST 等)以静态或动态响应进行响应,并可选择将请求传递给真正的 $httpBackend 以获取特定请求(例如,与某些远程 api 交互或获取来自网络服务器的模板)。

要解决您尝试做的事情,您可以尝试getAvailablePackages()为您的 json 文件路径返回 HTTP GET 并定义一个$httpBackend.whenGET('pathTo.json').passThrough();

于 2015-10-22T00:48:57.147 回答
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;

    });

}]);
于 2016-09-14T20:47:41.823 回答
0

您可以从 http 拦截器返回承诺。这是一个将 HTTP 调用延迟 1 秒的示例。你可以在你的app.config(....)

$httpProvider.interceptors.push(function($q, $timeout) {
    return {
        'response': function(response) {
            var defer = $q.defer();
            $timeout(function() {
                        defer.resolve(response);
                }, 1000);
            return defer.promise;
        }
    };
});
于 2018-09-14T14:48:20.070 回答