2013-12-19 1 views
2

У меня есть проблема, которая пытается найти решение. В Front End пытаюсь отобразить данные для пользователя для сравнения в таблице HTML. Существует три источника данных, из которых я извлекаю свои данные с помощью запросов Ajax.Запросы Ajax из нескольких источников, включая google api

Источник данных 1: Время, затраченное ~ 8 секунд Источник данных 2: Время, затраченное ~ 8 секунд Источник данных 3: Время, затраченное ~ 30 секунд

Мои Вызовы приступающим Ajax выполнены в виде функции, как показано ниже: -

function fetchAjax(){ 
     aggregatedAjaxObj = {} 

     ajax.request1(){ 

    } 
     ajax.request2(){ 

    } 
     ajax.request3(){ 

    } 

//Add all the response in the aggregatedAjaxObj Object. 

} 

function render(){ 

// render the object in the html table & display after a interval of 30 sec 
} 

Am с помощью Node.js, магистральной & Jquery расслоения плотного.

Если есть какой-либо лучший подход, хотелось бы попробовать.

ответ

2

У вас есть race condition здесь, а также ввести 30-секундную задержку. Кроме того, у вас есть глобальное состояние.

Оба они действительно ненадежны и плохи.

Предполагая, что вы не хотите, чтобы ввести хорошую библиотеку обещаний (я бы рекомендовал bluebird), используя инструменты, которые уже можно скачать с:

Использование JQuery:

var request1 = $.ajax(...); 
var request2 = $.ajax(...); 
var request3 = $.ajax(...); 
$.when(request1,request2,request3).done(function(results){ 
    // results contains all 3 request data 
    // no delay, will resolve when all 3 are done 
    // requests are made simultaneously 
    render(results); 
}); 

Использование стандарт Promise (Bluebird совместимый):

var request1 = $.ajax(...); 
var request2 = $.ajax(...); 
var request3 = $.ajax(...); 
Promise.all(request1,request2,request3).then(function(results){ 
    // results contains all 3 request data 
    // no delay, will resolve when all 3 are done 
    // requests are made simultaneously 
    render(results); 
}); 

лямбда всегда может быть далеко с, вы можете сделать:

Promise.map(["url1","url2","url3"],$.get).all(render); 
+0

Ох, круто, Бенджамин. Благодарю. Также мне хотелось бы знать одно: я думал о подходе, когда я делаю 3 запроса Ajax на сервере Node.js, агрегирует данные и затем делаю один вызов Ajax во внешнем интерфейсе. – Vivek

+0

Это также жизнеспособное решение, но это лишняя нагрузка для сервера - если это нормально для вас, этот подход тоже в порядке. –

+0

Спасибо за ваш ответ. – Vivek

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

  • Нет связанных вопросов^_^