1

我有一个非常简单的资源调用 CakePHP。当我使用 Advanced Rest Client 运行请求时,它会在大约 100 毫秒内返回。角度需要2-4秒。下面是我正在运行以“证明”资源是瓶颈的代码。

资源:

var resource = $resource('/index.php/props/:op/:id.json', {}, {
    getPropertyListByCategory: { method:'GET', params:{ op:'getPropertyListByCategory', category:'@category' } },
    setPropertyListByCategory: { method:'POST', params:{ op:'setPropertyListByCategory' } }
});

方法:

function getPropertyListByCategory(params) {
    var x1 = Date.now();
    var deferred = $q.defer();
    resource.getPropertyListByCategory(params, function(resp) {
        var x2 = Date.now();
        console.log(x2-x1);
        deferred.resolve(resp.data);
    });
    return deferred.promise;
}

您可以在资源调用之前看到 I 时间戳,然后将其与解析进行比较。同样,当我直接对 Cake 运行这个请求时,它返回的速度非常快。蛋糕不是问题。

有什么想法可以加快速度吗?

4

1 回答 1

2

$resource 并不慢

我想把它放在评论中,但它太长了,不适合,所以..

可能很容易认为$resource是这里的瓶颈,但我建议这是因为您不完全了解异步代码的工作原理,而不仅仅是 Angular 的工作原理。

您的“基准”无效,它假定回调被立即调用,并且在两者之间没有其他代码运行。

请参阅这个问题:AngularJS:为什么 $http 在您离开当前摘要之前实际上不会发出 http 请求?

$resource使用$http在下一个 $digest() 执行之前不会真正发送请求。

很多事情都会使 $digest 变慢,你应该检查应用程序的其他部分。

你也可以创建一个只有 $resource 的角度测试应用程序,看看它是否仍然很慢。

如果您考虑一下,您最后一次听说不涉及 $digest的angular.js性能问题是什么时候?!

再说一次,$resource 会出现什么问题?!这只是一个简单的服务。


function getPropertyListByCategory(params) {
    var x1 = Date.now();
    var deferred = $q.defer();

    // the request is queued and will run after a $digest!!
    resource.getPropertyListByCategory(params, function(resp) {

        var x2 = Date.now();
        deferred.resolve(resp.data);
    });

    // x3 is assigned before x2 ..

    var x3 = Date.now();

    return deferred.promise;
}
于 2014-01-28T16:22:53.813 回答