2013-06-14 6 views
0

Я изо всех сил пытаюсь вернуть одну из моих функций JavaScript. Пожалуйста, соблюдайте следующий код:Возвращаемое значение (вполне) базовой функции "undefined"?

function GW2API_getEventInfo(p_eventid) { 
    console.log("Getting EventInfo for event " + p_eventid); 
    $.each(arrEvents, function(i, eventItem) { 
     $.each(eventItem, function(j, eventInfo) { 
      if (eventInfo.event_id == p_eventid) { 
       console.log(GW2API_getEventName(p_eventid) + " - " + eventInfo.state); 
       return { 
        'name': GW2API_getEventName(p_eventid), 
        'state': eventInfo.state 
       }; 
      } 
     }); 
    }); 
} 

Теперь я хотел бы вернуть объект с двумя свойствами: «имя» и «состояние». Однако, независимо от того, что я добавляю под console.log, моя функция ничего не возвращает (хотя данные найдены, поэтому консоль регистрирует).

currEvent = GW2API_getEventInfo(GW2API_events_ShadowBehemoth[i]); alert(currEvent) -> дает "неопределенными"

+0

Посмотрите на этот ответ: http://stackoverflow.com/a/14441307/1233508. Вам нужно создать переменную на верхнем уровне функции, присвоить значение, которое вы хотите вернуть, а затем вернуть ее после завершения циклов. – DCoder

+0

Куда вы ожидаете от этого результата? Это анонимная функция, которая передается как аргумент функции jQuery. Эта функция ** ** возвращает ваш объект, он просто не возвращается в ваш код. –

+0

Спасибо всем за ваши ответы здесь. В самом деле, очень глупая ошибка моей, не возвращающая возвращаемое значение из внутреннего в внешний контур. После объявления переменной на верхнем уровне функции и просто присваивания ей данных в цикле (и возвращения заполненной переменной после циклов) работает как шарм !! – Tribio

ответ

1

Это должно - вы ничего не возвращаются.

Вы возвращаете что-то внутри анонимной функции второго $.each, но вы ничего не возвращаете в функции GW2API_getEventInfo.

Может быть, это то, что вы имели в виду:

function GW2API_getEventInfo(p_eventid) { 
    var result = null; 
    console.log("Getting EventInfo for event " + p_eventid); 
    $.each(arrEvents, function(i, eventItem) { 
     $.each(eventItem, function(j, eventInfo) { 
      if (eventInfo.event_id == p_eventid) { 
       console.log(GW2API_getEventName(p_eventid) + " - " + eventInfo.state); 
       result = { 
        'name': GW2API_getEventName(p_eventid), 
        'state': eventInfo.state 
       }; 
       return; //Out of the inner $.each 
      } 
     }); 
     if (result !== null) { 
      return; //Out of the outer $.each 
     } 
    }); 
    return result; //Return the value in the GW2API_getEventInfo function 
} 
+0

Благодарим вас за фрагмент кода! Действительно, не возвращая данные из внутреннего в внешний и эти данные из внешнего в остальную часть кода, я вроде как сейчас чувствую себя новичком. Еще раз спасибо! – Tribio

0

Использование .each() означает, что вы создаете внутреннюю функцию закрытия. Как бы то ни было, вы возвращаетесь из функции закрытия, но не возвращаетесь из своей основной функции.

Возможно, вам лучше не использовать jQuery .each() здесь и просто использовать стандартный цикл Javascript for().

function GW2API_getEventInfo(p_eventid) { 
    for(var i=0; i<=arrEvents.length; i++) { 
     var eventItem = arrEvents[i]; 
     for(var j=0; j<=eventItem.length; j++) { 
      var eventInfo = eventItem[j]; 
      if (eventInfo.event_id == p_eventid) { 
       return { 
        'name': GW2API_getEventName(p_eventid), 
        'state': eventInfo.state 
       }; 
      } 
     }); 
    }); 
} 

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

Вероятно, он будет работать быстрее, чем версия jQuery.

(заметьте, я не знаю структуру данных здесь, я предположил, что это arrEvents и eventItem являются массивы Если они объекты, вам нужно будет использовать цикл в for(..in..) стиль вместо этого, но принцип. то же самое)

Смежные вопросы