对AngularJS资源保存操作的承诺

moo*_*nli 19 html javascript rest angularjs

我目前正在开发REST + AngularJS应用程序.

关于资源保存行动的承诺我有一点问题.

我的工厂:

App.factory('Course', function($resource) {
    var course = $resource('/AppServer/admin/courses/:courseId', {}, {});

    course.findAll = function() {
        return course.query();
    };

    course.findById = function(id) {
        return course.get({
            courseId : id
        });

    };

    course.saveCourse = function(course) {
        return course.$save();
    }

    return course;
});
Run Code Online (Sandbox Code Playgroud)

我的控制器:

App.controller('CourseEditController', function($scope, $routeParams, $location, Course, FlashMessage) {
    // load course into edit form
    $scope.course = Course.findById($routeParams.courseId);

    // save edited course and print flash message
    $scope.saveCourse = function() {
        var savedCourse = Course.saveCourse($scope.course);

        savedCourse.$then(function(httpResponse) {
            FlashMessage.set("Die Änderungen am Kurs <i>" + savedCourse.title + "</i> wurden erfolgreich gespeichert.");
            $location.path("/kurse/verwalten");
        });
    }
}); 
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我得到以下异常:

TypeError: Cannot call method '$then' of undefined
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我向其中一个查找器(例如findById)添加相同的then-callback,一切正常.但是,与"return course.get({courseId:id})"的返回值相比,"return course.$ save()"的返回值是未定义的.这是"对象对象".

我想要的是在完全执行保存操作时设置FlashMessage,而不是在此之前设置.

有什么想法吗?我的REST服务的响应是正确的.它返回保存的对象.

迎接马克

小智 42

有两种略有不同的API,一种用于处理资源实例,另一种是缺少更好的单词 - 更通用的版本.使用$-prefixed方法的主要区别(getvs $get)

ngResource/resource.js中$-prefixed方法.代理呼叫并直接返回承诺.

AFAIK在资源获得实例化之前,您只能正常访问资源get.

var promise = Resource.get().$promise;

promise.then(function(res)  { console.log("success: ", res); });
promise.catch(function(res) { console.log("error: ", res); });
Run Code Online (Sandbox Code Playgroud)

使用instanciated资源,$可以使用-prefixed方法:

var res = new Resource({foo: "bar"});

res.$save()
    .then(function(res)  { console.log("authenticated") })
    .catch(function(req) { console.log("error saving obj"); })
    .finally(function()  { console.log("always called") });
Run Code Online (Sandbox Code Playgroud)

  • 是`Resource.$ get()`与`Resource.get().$ promise`相同? (7认同)

Cha*_*ani 3

如果您查看有关资源的角度文档,它会提到

重要的是要意识到调用 $resource 对象方法会立即返回一个空引用(对象或数组取决于 isArray)。一旦数据从服务器返回,现有的引用就会被实际数据填充。

这很可能意味着您对 $save 的调用将返回空引用。在 Angular 1.2 之前的 Resource api 上也不then可用,因为资源不是promise基于资源的。

您应该更改saveCourse方法调用以接受函数参数才能成功,并在那里执行必要的操作。