2013-09-23 5 views
9

Я пытаюсь получить два списка 2-х списков сообщений в блоге из 2 категорий (новости и события), а затем отобразить их в двух разных столбцах моей домашней страницы. Мне необходимо выполнить 2 отдельных вызова Ajax, чтобы получить эти сообщения в блоге. Я не использую данные ember-данных для этой операции, так как я не вижу преимущества использования этого в этом сценарии (но я могу ошибаться).Ember.js: несколько вызовов Ajax в одном маршруте

export default Ember.Route.extend({ 
    setupController(controller, model) { 
    var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category='; 

    Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }).then(function (data) { 
     controller.set('news', data.posts); 
    }); 
    Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }).then(function (data) { 
     controller.set('events', data.posts); 
    }); 
    } 
}); 

Приведенный выше код работает. Но из того, что я прочитал в документе Ember documetation, я должен получить эти данные в крюке model (вместо setupController), чтобы воспользоваться обещаниями. Поэтому я попытался переписать мой код таким образом:

export default Ember.Route.extend({ 
    model() { 
    var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category='; 

    return { 
     news: function() { 
     return Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }).then(function (data) { 
      return data.posts; 
     }) 
     }, 
     events: function() { 
     return Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }).then(function (data) { 
      return data.posts; 
     }) 
     } 
    }; 
    } 
}); 

Но это не работает. Вызов Ajax выполняется, но слишком поздно, после того, как страница отобразилась. Я не уверен, что я делаю неправильно. Будет ли какое-либо преимущество использования данных ember для этого сценария?

ответ

11

Вы можете вернуть хэш Promises с RSVP.hash()

Вы можете сделать это:

export default Ember.Route.extend({ 
    model() { 
     var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category='; 

     return new Ember.RSVP.hash({ 
      news: Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }), 
      events: Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }) 
     }); 
    } 
}); 

Подробнее о обещаниях в Эмбер here

+1

+1 для RSVP.hash(). Отличный ответ, именно то, что мне нужно - спасибо! – rog

3

Вы возвращаете объект, содержащий два обещания, а не фактическое обещание. Вам нужно создать собственное обещание (Ember.RSVP.Promise), которое будет разрешено после разрешения обоих внутренних обещаний.

+0

Спасибо за ваш ответ. Я понимаю, что у меня должно быть только одно обещание, но я не знаю, что будет делать моя функция resolve() ... я должен привязать вызовы Ajax или что-то еще? – Pedro

+1

Не нужно связывать. При каждом обратном вызове успеха проверьте, было ли другое обещание уже разрешено. Если это так, разрешите внешнее обещание. –

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