使用jquery从promise/ajax调用返回值

Eli*_*eth 4 jquery promise deferred requirejs

var viewmodel = service.createCustomer(); 是我调用requirejs模块的方式.

我如何创建一个延迟对象,我的createCustomer返回在服务调用中创建的CreateCustomerViewModel?

define(['viewmodels/CreateCustomerViewModel'],function (CreateCustomerViewModel) {

    function createCustomer() {
        $.getJSON('Customer/Create')
         .done(function (response) {
             return new CreateCustomerViewModel(response);
         })
         .fail(function (error) {
             alert(error);
         });
    }   

    return {        
        createCustomer: createCustomer        
    };
});
Run Code Online (Sandbox Code Playgroud)

Ate*_*ral 6

  1. 您必须使用.then()而不是.done()修改有效负载.
  2. 您应该让您的createCustomer方法返回修改后的有效负载.

您的模块定义变为:

function createCustomer() {
    return $.getJSON('Customer/Create')
        .then(function (response) {
            return new CreateCustomerViewModel(response);
        });
}

return {
    createCustomer: createCustomer
};
Run Code Online (Sandbox Code Playgroud)

用于:

customerCreator.createCustomer()
    .done(function (model) {
        // yay! let's use this model
    })
    .fail(function () {
        console.error("Cannot create customer");
    });
Run Code Online (Sandbox Code Playgroud)

您还应该尽可能地将.fail()处理移到应用程序的外部,以便错误消息中的措辞可以具有更准确的上下文.

PS作为一个挑剔者,您不应该使用POST请求而不是GET来创建实体吗?