2013-11-18 4 views
1

Есть ли библиотека, которая абстрагирует асинхронное поведение запросов XHR? Наблюдал за приведенным ниже видео (Ember.js intro). Было бы здорово, если бы я мог просто получить функцию асинхронной абстракции отдельно от класса маршрутизатора Ember. Кроме того, любое направление на том, как это делается также быть большимКак абстрагироваться от асинхронного поведения запроса ajax, такого как Ember.js?

https://www.youtube.com/watch?v=1QHrlFlaXdI

(около 23:00 минут),

Пример,

var model=[]; 
var obj = { 
getModel: function(){ 
     if(!model.length){ 
      // sendRequest and store the response in model and 
      // return it 
     }else{ 
      return model; 
     } 
} 
} 

http://jsfiddle.net/4YQ4W/

Так , в этом примере obj.getModel() должен получить мне модель, независимо от того, обслуживается ли она с сервера или нет.

Спасибо!

+0

Как именно вы ожидаете «абстрактное асинхронное поведение XHR»? что ты уже испробовал? – David

+0

@ Давид: обновил мой вопрос .. –

ответ

3

Одна из моделей, предназначенных для добавления уровня абстракции для синхронизации/асинхронного поведения является Promises/A+ спецификацией, и одна популярной реализация Kris Kowal's Q

Это позволяет писать асинхронную код, который ведет себя в предсказуемом и легко контролировать манера.

пример из ридми:

return getUsername() 
.then(function (username) { 
    return getUser(username); 
}) 
.then(function (user) { 
    // if we get here without an error, 
    // the value returned here 
    // or the exception thrown here 
    // resolves the promise returned 
    // by the first line 
}); 

где getUserName это функция, возвращающая обещание.

Таким образом, в вашем случае, это может быть как:

getModel: function(){ 
    var d = Q.defer(); 
    if(!model.length){ 
    // pass the `resolve` function as success callback to the ajax request. 
    // pass the `reject` function as fail callback to the ajax request. 
     ajaxGetModel(url, d.resolve, d.reject) 
    } else { 
     d.resolve(existingModel); 
    } 

    return d.promise; 
} 

, то вы можете

getModel().then(function(modelObject) { ... }); 

Таким образом, потребитель вашего API не нужно беспокоиться о том, ваши варианты выполнения синхронизации или async, так как он всегда обрабатывается согласованным образом.

Edit: ОК, так что я порылся немного в источнике Эмбер и обнаружили, что Эмбер действительно реализовать форму обещаний API в суб-модуль ember-runtime в классе под названием Deferred, который я подозреваю, что используется в вашем вопросе.

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