Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > функция не возвращает результат


Автор: z006 19.2.2010, 19:15
Добрый день.
есть вопрос,и подозреваю что глупый,ибо решение где-то на поверхности,но я его не вижу...((((
суть проблемы:

имеем такой код:

Код

function a(inputname)
{
.......
.......
.......
var c=block.firstChild.nodeValue;
return c;
.......
.......
.......
}
function b(inputname)
{
var cvb=a(inputname);
alert(cvb);
}


вызываем ф-цию b,она вызывает ф-цию а с параметром.ф-ция а отрабатывает верно,если там проверять алертом значение переменной с-то все верно.но когда в ф-ции b идет вывод значения cvb - то выдает undefined.
думал может не успевает передать значение.пробовал ставить в ф-цию b setTimeout.результат одинаковый.
где тут псинка закопана?

Автор: Amphiluke 19.2.2010, 19:36
Проблема явно не в том куске кода, который вы привели, а где-то в той части, что вы здесь не показали.
Вот сами проверьте:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
<script type="text/javascript">
function a(inputname){
    var block = document.getElementById("ablock");
    var c=block.firstChild.nodeValue;
    return c;
}
function b(inputname){
var cvb=a(inputname);
alert(cvb);
}
</script>
</head>

<body>
<div id="ablock">nodeValue</div>
<p onclick="b('qq');">click</p>
</body>
</html>

Автор: z006 19.2.2010, 20:17
и правда этот пример работает.....очень странно....выкладываю весь кусок кода


Код

function check1(inputname)
{
var name=document.getElementById(inputname).value;
 url=".....................php?name="+name;
    function getXMLHttpRequest() 
     {
      var xmlhttpreq=null;
      if (window.XMLHttpRequest) //Mozilla, Safari & IE 7
       {
    xmlhttpreq = new XMLHttpRequest();
       }
      else if(window.ActiveXObject) // IE 6 and later
       {
    try 
    {
     xmlhttpreq = new ActiveXObject('Msxml2.XMLHTTP');
    }
    catch(err) 
    {
     xmlhttpreq = new ActiveXObject('Microsoft.XMLHTTP');
    }
       }
      return xmlhttpreq;
     }
    function sendRequest(method, url, param)
     {
      var request = getXMLHttpRequest();
      request.open(method, url, true);
      request.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded');
      request.onreadystatechange = function() 
       {
    handleAjaxResponse(request);
       };
      request.send(param);
     }
    function isSuccess(request)
     {
      return request.status == 0 || (request.status >= 200 && request.status < 300);
     }
    function handleAjaxResponse(request)
     {
   if(request.readyState == 4) 
       {
    if(isSuccess(request))
     {
      var responseXML = request.responseXML;
      var root = responseXML.getElementsByTagName('response').item(0);
      var responseID = Array();
      var responseValue = Array();
      for (var iNode = 0; iNode < root.childNodes.length; iNode++) 
       {
        var node = root.childNodes.item(iNode);
        for (ik = 0; ik < node.childNodes.length; ik++) 
         {
          var block = node.childNodes.item(ik);
          if (block.nodeType != 1) 
          continue;
          switch(block.nodeName)
           {
        case "answer":
        var c=block.firstChild.nodeValue;
        return c;
        break;
           }
         }
       }
      for(ik=0; responseID.length; ik++)
       {
        document.getElementById(responseID.pop()).innerHTML = responseValue.pop();
       }
     }
       }
     }
sendRequest('GET', url, null);
}
function check(inputname)
{
var cvb=check1(inputname);
alert(cvb);
}


результат,прилетающий от пхп файла,простой: 0 или 1

Автор: Amphiluke 19.2.2010, 20:28
Ну вот и покажите мне теперь где у вас написано, чтобы функция check1 возвращала бы какое-либо значение? smile 
Строка 
Цитата

Код

return c;


это возврат значения вложенной функцией handleAjaxResponse, а вот сама check1 нигде ничего не возвращает.

Автор: z006 19.2.2010, 20:36
вот я видимо сейчас опозорюсь с этим вопросом,но а как заставить её вернуть это значение именно от имени ф-ции check1?
если ставлю переменню с как глобальную,и переношу ретёрн так,то все-равно андефинед.
Код

sendRequest('GET', url, null);
return c;

Автор: Amphiluke 19.2.2010, 20:43
Цитата(z006 @  19.2.2010,  23:36 Найти цитируемый пост)
если ставлю переменню с как глобальную,и переношу ретёрн так,то все-равно андефинед

Ну ясное дело. smile Функция check1 спокойно отправляет запрос и не заботится о том, чтобы ожидать ответа. Этим занимается onreadystatechange ну и ваша handleAjaxResponse.

Грубо говоря, этот alert(cvb) нужно вызывать только из handleAjaxResponse, когда readyState примет значение 4...

Автор: z006 19.2.2010, 20:48
это я понимаю,но я хотел чтоб у меня была одна функция,которая сможет отсылать запросы на пхп"шные файлы,и получать их ответы,а потом уже отдавать этот полученный ответ тем функциям,которые первоначально запросили его,чтоб уже в этих мелких ф-циях разбирать эти ответы как надо.грубо говоря жалкое подобие библиотеки что-ли надо... smile 
но почему-то не получается.....как его "вывернуть",чтоб оно заработало как мне надо? smile 

Автор: Amphiluke 19.2.2010, 20:49
P.S. Если непонятно сказал, функция check1 завершается раньше, чем будут получены данные.

Добавлено через 3 минуты и 11 секунд
У вас используются асинхронные запросы? Ну если так нужно, сделайте синхроные. Но тогда нужен будет тот ход с глобальной переменной c, который вы только что пробовали.

Добавлено через 6 минут и 37 секунд
А вообще я не вижу ничего плохого в том, чтобы по получении данных асинхронным запросом, вызвать в методе onreadystatechange нужную ф-цию обработки полученных данных. Зачем возвращаться в вызывавшую функцию? smile

Автор: z006 19.2.2010, 21:05
ну я просто ж  не знаю в какую ф-цию надо будет передать результат.
это что,для вызова ф-ции check1 допустим по нажатию кнопки,к примеру,в onmouseup надо будет указать параметры:поле откуда берем значение,имя ф-ции,куда будем отдавать результат.
так получается?

Автор: Amphiluke 19.2.2010, 21:14
Ну если вы не знаете, в какую ф-цию передавать данные, то, видимо, да, так.
Человек, который будет вызывать ф-цию check1, должен будет передать ей в параметре указатель на нужную ему callback-функцию. А метод onreadystatechange по этому указателю вызовет функцию.
Если помимо этого есть много других передаваемых параметров, их можно объединить в один объект, методом которого будет в частности и callback-функция. И тогда нужно будет лишь передавать функции check1 указатель на этот объект.

Автор: z006 19.2.2010, 21:18
я перенабросал код,но стал немного в тупик.если у меня имя функции содержится в переменной скажем funcname ,то не вызову-же я эту функцию так: funcname( с );
как её вызвать?........user posted image

Автор: Amphiluke 19.2.2010, 21:21
Передавайте не имя функции в виде строки, а указатель на нее.
Либо, если передаете имя-строку, можно воспользоваться ф-цией eval для вызова по имени... Хотя это менее предпочтительный вариант, чем первый.

Автор: z006 19.2.2010, 21:37
поставили в тупик. smile 
опыта и знаний маловато.ушел читать литературу.за ссылки что почитать-буду благодарен.

Автор: Amphiluke 19.2.2010, 21:41
А что не получается-то?

Автор: z006 19.2.2010, 21:45
по поводу вызова функции через указатель или евал

Автор: Amphiluke 19.2.2010, 21:52
Ну вот например...
Код

function requestResultsProcessing(requestResults) {
    // обработка полученных данных
}

function check1(callbackFunction) {
    .....................
    if (request.readyState == 4) {
        .................
        var c=block.firstChild.nodeValue;
        callbackFunction(с);
    }
    .....................
}

// вызов ф-ции check1 с передачей ей указателя на ф-цию обработки данных
check1(requestResultsProcessing);


или
Код

function requestResultsProcessing(requestResults) {
    // обработка полученных данных
}

function check1(callbackFunctionName) {
    .....................
    if (request.readyState == 4) {
        .................
        var c=block.firstChild.nodeValue;
        eval(callbackFunctionName + "(" + с + ")");
    }
    .....................
}

// вызов ф-ции check1 с передачей ей имени ф-ции обработки данных
check1("requestResultsProcessing");


Автор: z006 19.2.2010, 21:56
к сожалению плюсик жмакать не могу,т.к. не имею 100 постов.
поэтому просто большое человеческое спасибо.
буду разбираться уже завтра,на сегодня все.если что-я еще напишу завтра.

Автор: z006 20.2.2010, 20:08
странно....у меня не выходит.....вызываю по событию onkeyup=checkdata('childlogin','checklogin')  ,где checklogin это имя функции которой надо отдать результат.
Код

function checkdata(inputname,funcname)
{
....................
        case "answer":
        var c=block.firstChild.nodeValue;
        funcname(c);
           }
........................       
}
function checklogin(name)
{
alert(name);
}


в обработчике мне выдает Ошибка: funcname is not a function

где я не уловил суть?

Автор: Amphiluke 20.2.2010, 20:21
Если передаете строковое представление имени функции, вызывайте с помощью eval, как показано выше. А лучше передавайте указатель.

Автор: z006 20.2.2010, 20:31
точно.передал не как строковые данные-и заработало! smile 
спасибо огромное! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)