2013-09-28 151 views
4

var viewmodel = service.createCustomer();是我调用requirejs模块的方式。从jquery返回promise/ajax调用的值

我该如何创建一个延迟对象,让我的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   
    }; 
}); 

回答

6
  1. 您必须使用.then()代替.done()修改的有效载荷。
  2. 你应该让你的createCustomer方法返回修改后的有效载荷。

你的模块定义变为:

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

return { 
    createCustomer: createCustomer 
}; 

用途为:

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

你也应该移动.fail()处理外,如高高的应用成为可能,从而使措辞在你的错误信息中可以有更准确的上下文。

P.S.作为一个挑剔的人,不应该使用POST请求而不是GET来创建一个实体吗?

+0

2件事情:我想通过var viewmodel = service.createCustomer()获取返回值,而.done .fail应该在服务中,因为它们可能是服务错误。视图模型不知道这一点。另外还有一个GET请求,因为我没有发布数据我检索公式的数据来显示然后我做了一个帖子;-) – Elisabeth

+0

因为'$ .getJSON'将是异步的,所以你不能'viewmodel = service.createCustomer() '。你必须使用经典的回调或Promise(更好)。 –

+1

对于那些使用jQuery <1.8使用'pipe'而不是'then'。我浪费了几个小时来处理这个问题。 – nikoskip