AngularJS $resource медленно возвращается

У меня есть очень простой ресурс, который называется 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, он возвращается очень быстро. Торт не проблема.

Любые идеи, как я могу немного ускорить это?


person Justin Boyson    schedule 28.01.2014    source источник
comment
для какого объекта resource вы вызываете функцию getPropertyListByCategory? Это Angular Service/Factory?   -  person Jasdeep Singh    schedule 28.01.2014
comment
Га извини. Редактирование кода.   -  person Justin Boyson    schedule 28.01.2014


Ответы (1)


$ресурс не медленный

Я хотел поместить это в комментарий, но он слишком длинный, чтобы поместиться, так что..

Может возникнуть соблазн подумать, что $resource является узким местом здесь, но я полагаю, что это потому, что вы не полностью понимаете, как работает асинхронный код и более того, как работает angular.

Ваш "контрольный показатель" недействителен, он предполагает, что обратный вызов вызывается немедленно, и между ними не выполняется никакой другой код.

См. этот вопрос: https://stackoverflow.com/questions/20605291/angularjs-why-does-http-not-actually-make-a-http-request-until-you-leave-the-c

$resource использует $http, который фактически не будет отправлять запрос, пока не будет выполнен следующий $digest().

Много вещей могут сделать $digest медленным, вы должны проверить другие части вашего приложения на предмет этого.

Вы также можете создать тестовое приложение angular только с $resource и посмотреть, работает ли оно по-прежнему медленно.

Если подумать, когда вы в последний раз слышали о проблеме с производительностью angular.js, которая не связана с $digest?!

Опять же, что может быть медленным с $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;
}
person Ilan Frumer    schedule 28.01.2014
comment
ngRepeat возможно создание слишком большого количества привязок данных, 95% случаев. - person Ilan Frumer; 28.01.2014