2013-09-28 6 views
4

var viewmodel = service.createCustomer(); - это способ, которым я называю модуль requirejs.вернуть значение из обещания/ajax-вызова с помощью jquery

Как создать отложенный объект, который мой 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 должны быть в службе, потому что они просто могут быть служебными ошибками. Модель просмотра не знает этого. Furtheremore его запрос GET, потому что я не отправляю данные, я извлекаю данные для формы для отображения, а затем я делаю сообщение ;-) – Elisabeth

+0

Так как '$ .getJSON' будет асинхронным, вы не сможете сделать' viewmodel = service.createCustomer() '. Вы должны использовать либо классический обратный вызов, либо обещание (лучше). –

+1

Для тех, кто использует jQuery <1.8, используйте 'pipe' вместо' then'. Я потратил несколько часов на это. – nikoskip

Смежные вопросы