Вопрос по javascript, ajax, jquery, post – Возможно ли использовать ajax respone вне его?

2

Любой способ использованияdata_response вне$.post()?

Это часть кода, который я использую:

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        var response = data_response; //I need to access this variable outside of $.post()
    }
}, "json");

console.log(response); //response is not defined, is what I get for now
ОБНОВИТ

Нет ли способа получить этот ответ в глобальном масштабе?

Ваш Ответ

5   ответов
2

$.post выполняется асинхронно, поэтому при вызовеconsole.log, запрос AJAX все еще выполняется и еще не дал ответа. Это цель функции обратного вызова: предоставить код для запускапосл запрос завершен. Если вы двигаетесьconsole.log в функцию обратного вызова, она должна работать:

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        var response = data_response; //I need to access this variable outside of $.post()
        console.log(response);
    }
}, "json");

Обновить Если вы хотите, чтобы данные ответов были доступны глобально, вы можете объявить переменную в глобальной области видимости следующим образом:

var response = null;
$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        response = data_response;
        console.log(response);
    }
}, "json");

Конечно, единственный контекст, в котором вы можете быть уверены, чтоresponse фактически заполнено значением в функции обратного вызова, переданной$.post после строкиresponse = data_response;. Если вы хотите использовать его на любом другом этапе сценария, вам сначала нужно проверить его значение; что-то вроде этого

if (response !== null)
{
    console.log(response);
}

Просто знайте, что этот код ничего не сделает, если вы положите его сразу после$.post вызов; он будет полезен только в том случае, если он выполняется после завершения запроса POST, в каком-либо другом асинхронном обратном вызове (возможно, в некотором роде событие взаимодействия с пользовательским интерфейсом).

@ w0rldart: Вы можете назначить его переменной глобальной области видимости, но вы должны быть осторожны с фактическим заполнением. Смотрите обновление. Will Vousden
нет ли способа получить этот ответ в глобальном масштабе? Alex
1

чтобы она находилась в той части кода, к которой вы можете обратиться:

var response;

$.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
    response = data_response; 
    }
}, "json");

console.log(response); //response is now defined - It won't be populated yet though.

Как указывалось в приведенном выше коде, хотя ответ будет определен, он не будет заполнен к тому времени, когда вы вызовете console.log, однако, если вы получите доступ к переменной в какой-то момент после срабатывания обратного вызова, он будет заполнен.

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

Шаблон модуля Крокфорда:http: //www.yuiblog.com/blog/2007/06/12/module-pattern

нет,тольк разумный способ решить проблему с OP - использовать значение либо обратный вызов или в цепочке функций, вызываемых обратным вызовом. Просто «надеяться» на то, что в какой-то момент переменная будет заполнена, - рецепт катастрофы. Alnitak
Честно говоря, я думаю, что вопрос действительно в области определения переменных - то, что вы делаете с этой переменной, выходит за рамки вопроса. Очевидно, он не будет заполнен до тех пор, пока не сработает обратный звонок. Paul
1

шего скрипта, если он будет выполнен, он будет выполнен немедленно, если нет, он будет выполнен после выполнения вызова ajax.

var XHR = $.post('do.php', { OP: "news_search", category: cat_id },
    function(data_response){
        // do somehing with data_response
    }
}, "json");


function doSomethingElse() {
    XHR.done(function(response) {
        console.log(response);
    });
}
0

и вы должны быть уверены, что это значение заполняется сразу после вызова $ .post (), вы можете попытаться сделать вызов POST синхронным способом. Этого нельзя сделать с помощью $ .post (), но можно сделать с помощью $ .ajax ():

var returnedData = null;

$.ajax({
  type: 'POST',
  url: 'do.php', 
  data: { OP: "news_search", category: cat_id },
  success: function (response) {
            returnedData = response;
        },
  dataType: "text"
});

console.log(returnedData );
не работает ... Alex
0

У меня получилось так:

var returnedData = {}; //Declaring Object var not just var
$.ajax({
type: 'POST',
url: 'do.php',
data: { OP: "news_search", category: cat_id },
success: function (response) {
returnedData.result1=response;  //Add response into the Object created outside the ajax
},
dataType: "json"
});
console.log(returnedData);//inside it you can get returnedData.result1

Похожие вопросы