$ ресурс углового возврата не определен с $ обещанием

0

Я давно застрял на этом и не могу понять, почему значение не возвращается. Я использую $resource Angular $resource чтобы сделать запрос GET API.

Моя фабрика ресурсов $ выглядит так:

.factory("Bookings", function ($resource) {
    return $resource("www.example/bookings_on_date/:day", {});
})

Я попытался выполнить обещания, но не могу сделать это правильно.

function getBookings(day){
        return Bookings.get({"day": day}).$promise.then(function(data) {
        console.log(data.total)
        return data.total;
    });
}

$scope.todaysBookings = getBookings(TODAY);
$scope.tomorrowsBookings = getBookings(TOMORROW);

Когда я просматриваю либо console.log($scope.todaysBookings) либо $scope.tomorrowBookings в консоли, он возвращает undefined.

Я также попробовал все, начиная с этого jsfiddle, но, к сожалению, не повезло.

Теги:

1 ответ

2
Лучший ответ

Я думаю, это должно быть так:

function getBookings(day) {
    return Bookings.get({"day": day}).$promise.then(function(data) {
        return data.total;
    });
}

getBookings(TODAY).then(function(total) {
    $scope.todaysBookings = total;
});

getBookings(TOMORROW).then(function(total) {
    $scope.tomorrowsBookings = total;
});

Обновление: я думаю, что следующий стиль кода может помочь вам предотвратить следующие проблемы с расширенным методом:

function getBookings(args) {
    return Bookings.get(args).$promise;
}

getBookings({"day": TODAY}).then(function(data) {
    $scope.todaysBookings = data.total;
});

getBookings({"day": TOMORROW}).then(function(data) {
    $scope.tomorrowsBookings = data.total;
});

Здесь немного преимуществ:

  • Передача объекта в функцию может помочь вам легко передать разные аргументы в метод, и аргументы очень близки к вызову метода (немного легко читать);
  • Возврат полного ответа от функции может помочь вам обрабатывать разные данные (метод может воспроизводить разные ответы в зависимости от аргументов, но в этом случае это не очень хорошая практика);

ps В противном случае вы могли бы удалить объявление функции и код, как это (чтобы сделать его максимально простым):

Bookings.get({"day": TODAY}).$promise.then(function(data) {
    $scope.todaysBookings = data.total;
});

Bookings.get({"day": TOMORROW}).$promise.then(function(data) {
    $scope.tomorrowsBookings = data.total;
});
  • 0
    @Paul Fitzgerald обновлен
  • 0
    отличный ответ, спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню