Javascript - вернуть значение из функции, вызванной в другом месте - PullRequest
2 голосов
/ 22 февраля 2012

Название этого вопроса не очень понятно, но я не могу объяснить, что я спрашиваю, не предоставив некоторый код.

Я делаю страницу, которая представляет отчеты (которые являются массивами), используя AJAX. У меня есть функции, хранящиеся в библиотеке, которые отправляют массив на страницу PHP, которая выглядит следующим образом:

function saveReport(params)
{
    var url="reports/save.php";

        xmlHttp=GetXmlHttpObject();
        if (xmlHttp==null)
        {
            return false;
        }
        xmlHttp.onreadystatechange=stateChanged;
        xmlHttp.open("POST",url,true);
        //Send the proper header information along with the request
        xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlHttp.setRequestHeader("Content-length", params.length);
        xmlHttp.setRequestHeader("Connection", "close");
        xmlHttp.send(params);

}

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    { 
        if (xmlHttp.responseText == 'complete')
        {
            return true;
        }
        else
        {
            return false;
        }
    } 
}

(я не верю, что функция GetXmlHttpObject () имеет отношение к вопросу)

Я хотел бы иметь возможность вызывать saveReport () со своей страницы следующим образом

success = saveReport(params);
if (success == true)
{
    alert('success');
}
else
{
    alert('failure');
}

Таким образом, функция saveReport () должна возвращать значение, которое возвращается из функции stateChanged () при ее вызове, чтобы страница, которая вызвала saveReport (), могла затем решить, что делать - что может отличаться в разных страницы. Есть ли способ сделать это?

Я понимаю, что это может быть невозможно, как я пытаюсь, но есть ли что-то, что я могу сделать с таким же эффектом.

Ответы [ 4 ]

1 голос
/ 22 февраля 2012

Похоже, у вас есть пара проблем:

1) Асинхронные операции вызывают проблемы с возвратами функций, так как функция завершает работу до того, как возвращается асинхронный ответ. 2) Функция будет возвращать только то, о чем вы говорите, поэтому чтобы получить функцию, возвращающую результат другой функции, вам нужно сделать что-то вроде этого: return stateChanged( args )

Решение 1) состоит в использовании обратного вызова, например:

function saveReport( params, callback ){
...
xmlHttp.onreadystatechange = function(){
    stateChanged( callback );
};

Запустить обратный вызов внутри stateChanged () ...

function stateChanged( callback ){
...
callback( true );
...
callback( false );

Затем передать обратный вызов следующим образом:

saveReport( params, function( boolean ){
    if( boolean )
        alert('success');
    else
        alert('failure');
};
1 голос
/ 22 февраля 2012

Вы не сможете сделать это так, потому что запрос не блокируется (он асинхронный).Вам нужно будет использовать обратный вызов так же, как вы установили stateChanged() в качестве функции обратного вызова для xmlHttp.onreadystatechange.

. Вы можете создать новую функцию, которая обрабатывает результаты, и вызывать ее изstateChanged(), передавая true или false в качестве параметра, указывающего на успех.

function stateChanged() 
{ 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    { 
        saveReportFinished(xmlHttp.responseText == 'complete');
    }
    else{
        saveReportFinished(false); 
    }
}

function saveReportFinished(success) {
    if (success == true)
    {
        alert('success');
    }
    else
    {
        alert('failure');
    }
}

Технически вы можете просто объединить все это в stateChanged(), но я думаю, что так будет чище.

1 голос
/ 22 февраля 2012

Есть ли причина, по которой вы катаете своего собственного помощника Ajax?

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

Очевидно, что вы можете использовать что-то вроде jQuery.ajax , но это может быть излишним для чего-то такого простого.

Вы можете попробовать одну из множества микро-библиотек Ajax на http://microjs.com/#ajax, чтобы добиться того, что вам нужно.

0 голосов
/ 22 февраля 2012

Вы пробовали

success = saveReport(stateChanged());
if (success == true) {
    alert('success');
} else {
    alert('failure');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...