2016-01-29 2 views
0

Однако я пытаюсь сделать переменную зависимой от обратного вызова от функции AJAX get; Я не могу заставить его работать. Я хочу убедиться, что defaults.context всегда имеет значение, прежде чем переходить к другому коду.AJAX get и callbacks

Что я делаю неправильно или как я могу достичь этого надлежащим образом?

var defaults = { 
    currentCase: undefined, 
    context: {} 
    } 

    // Set defaults 
    function initDefaults(){ 
    defaults.currentCase = getCurrentCase(); 
    defaults.context = getContext(defaults.currentCase, function(object){ 
     console.log(object); // logs the right data 
     return object; 
    }); 
    console.log(defaults.context); // logs undefined 
    } 

    initDefaults(); 

    // Get the ID of the current case 
    function getCurrentCase(){ 
    return global_vars.project_ID; 
    } 

    function getContext(id, callback){ 
    var obj = {}; 

    $.get(global_vars.template_url + "/includes/load-project-context.php?id=" + id, function(data) { 
     obj = JSON.parse(data); 
    }).complete(function() { 
     callback(obj); 
    }); 
    } 

Спасибо, что касается

Enzio

+2

Возможного дубликат [Как вернуть ответ от асинхронного вызова?] (HTTP: // stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) – Andreas

+1

Похоже, вы уже знаете концепцию обратных вызовов, поскольку вы передаете один из них в getContext '. Вам просто нужно продолжать использовать обратные вызовы по мере необходимости. –

+1

Вы пытаетесь вывести 'defaults.context' перед завершением запроса ajax. Поэтому в тот момент, когда вы вызываете 'console.log',' defaults.context' еще не определен. – mickiewicz

ответ

0

Вы можете использовать что-то вроде

global_vars.template_url + "/includes/load-project-context.php?id=" + id, function(data) { 
    obj = JSON.parse(data); 
}).complete(function() { 
    callback(obj); 
}).fail(function() { 
    callback(error); 
}); 

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

+0

Это ничего не меняет. 'defaults.context' все еще не определено. – mickiewicz

0

Возможно, вам следует продолжить дальнейший код в обратном вызове ajax.

// Set defaults 
function initDefaults() { 
    defaults.currentCase = getCurrentCase(); 
    getContext(defaults.currentCase, function(object) { 
     defaults.context = object;  // Continue your code inside here 
     console.log(defaults.context); // Logs the right data 
     return object; 
    }); 

    // This will still return `undefined` because this line will be executed 
    // before the ajax request finishes. 
    console.log(defaults.context); 
}