Ваши инстинкты верны: не выполняет синхронный AJAX. Вместо этого поместите код, который ожидает "результат" внутри обратного вызова "success"!
jQuery('a.open-popup').click(function(){
var $parent = jQuery(this).parent();
var $InvestmentID = $parent.siblings('input').attr('value');
var $inputs;
var $outputs;
$inputs = { 'InvestmentID' : $InvestmentID };
$outputs = completed_investment($inputs, function($outputs) {
if ($outputs.state == 'Begin')
{
$parent.siblings('.plan-msg').remove();
$parent.removeClass('completed-button')
.addClass('add-inv-button ')
.html('+ Add to Your Plan');
$newpoints = '(+' + $outputs.points + " " + $outputs.plural + ")";
$parent.siblings('.done-points').removeClass('done-points')
.addClass('add-points')
.html($newpoints);
}
});
Затем измените функцию, которая вызывает AJAX:
function completed_investment($inputs, whenFinished) {
var result;
jQuery.ajax({
type: 'POST',
url: '/ajax/completed_investment',
dataType: 'json',
data: $inputs,
async: false, // need to wait until get result.
success: function(data) {
whenFinished(data);
}
});
}
Основная идея JavaScript состоит в том, что, поскольку так просто , просто обернуть несколькокод в анонимной функции и бросить его, нет необходимости иметь код "ждать", как вы описываете.Вместо этого вы просто упаковываете работу и передаете ее сервисной функции для использования в качестве обработчика событий.Когда HTTP-запрос завершается, это вхождение вызовет событие, и ваш обработчик вызывается.Из-за правил области видимости в JavaScript локальные переменные, доступные для вашего кода, по-прежнему доступны точно так же, как они были установлены при передаче функции-обработчика в механизм AJAX.