2013-09-28 192 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