2015-02-27 5 views
3

Я пишу javascript, который включает в себя вызовы серии AJAX, и я ищу элегантное решение для следующей проблемы: Цель скрипта - собрать параметры, а затем выполнить вызов API с помощью этих параметры. В первый раз, когда выполняется вызов, есть один параметр, который необходимо запросить с сервера - каждый последующий вызов будет использовать сохраненное значение этого параметра. Здесь начинается проблема. Я хочу, чтобы условный вызов AJAX выполнялся только в том случае, если это первый раз. Я не хочу включать остальную часть кода в функцию успеха этого вызова AJAX, поскольку это кажется запутанным. Я хотел бы что-то вроде следующего, но из-за очевидной асинхронности вызова я понимаю, что это невозможно. Я также хочу, чтобы избежать необходимости синхронного вызова, так как это может вызвать поток блокировать:Элегантное решение условного вызова AJAX

var myParameter; 

if(!params.myParam.isStored) { 
    myParameter = getParamWithAjaxCall(); 
} else { 
    myParameter = params.myParam; 
} 

// Continue with the rest of execution here of which there is a lot of code 

Извините, если это кажется очевидным вопросом, и я посмотрел на решения с использованием следующим, но я ищу опытное мнение на то, что самое элегантное решение будет:

JQuery: when.done

JQuery: асинхронная ложь

Передача обратного вызова для вызова Ajax

ответ

3

Я бы создал функцию обертки, которую вы передаете своей логике в качестве обратного вызова в done(). Что-то вроде этого:

function makeRequest(callback) { 
    if (!params.myParam) { 
     // retrieve param 
     $.ajax({ 
      url: '/getParam', 
      success: function(data) { 
       params.myParam = data.param; 
      } 
     }).done(callback); 
    } 
    else { 
     // param already has a value... 
     callback(); 
    } 
} 

makeRequest(function() { 
    // make your AJAX request here, knowing that params.myParam will have a value. 
}); 
+0

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

+0

Без проблем, рад помочь! –

1

Вы можете использовать обещание, как это (я использовал JQuery обещает здесь):

function ParameterValueProvider() { 

    var parameterValue; 

    return function() { 

     var deferred = $.Deferred(); 

     if (parameterValue === undefined) { 
      $.ajax({ 
       // ... ajax parameters go here 
      }).done(function(rsp) { 
       parameterValue = rsp; 
       deferred.resolve(parameterValue); 
      }); 
     } 

     deferred.resolve(parameterValue); 

     return deferred; 

    } 

} 

// Your Application 
(function() { 

    'use strict'; 

    var getParam = ParameterValueProvider(); 

    // this will get the value from server the firs time 
    // and subsequent calls will use the cached value 
    getParam().then(function() { 
     // subsequent ajax calls go here 
    }); 

}()); 
+0

Это был отличный ответ, но это кажется немного более привлекательным, чем @ rory's. Мне нужно взглянуть на обещания, чтобы лучше понять себя, прежде чем использовать их. Спасибо, много! – gimg1

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