2014-02-07 4 views
2

Во-первых, я новичок в javascript, и это мой первый «проект» на этом языке, поэтому я заранее извиняюсь за свое нежелание.Функция Javascript возвращает undefined

Я использую листовки и D3 в этом проекте, и я не могу заставить эту функцию возвращать что-либо, кроме «Undefined». Сначала я, хотя я не возвращался из функции должным образом, поэтому я попытался воспроизвести ошибку в меньшем масштабе здесь:

http://jsfiddle.net/KhqwR/

Однако, что работал для меня, так что теперь я немного потерял на что делать.

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

$(function() { 
    ... 
    function getThings(code) {  
    d3.csv("data.csv", function(data){ 
     for (var i = 0, len = data.length; i < len; i++){   
     if (data[i].code == code){      
      alert("return 5!") 
      return 5; 
     } 
     else{ 
      return 0; 
     } 
     } 
    }) 
    } 

    L.geoJson(features, { 
    style: function (feature) { 
     return { opacity: 0, fillOpacity: 0.5, fillColor: "#0f0" }; 
    }, 
    onEachFeature: function(feature, layer){ 
     var test = getThings(5);  
     alert(test); 
     ... 

Я последовательно добраться до «возвращения 5 !» а затем в сообщении alert (test) я просто получаю «Undefined».

Кто-нибудь знает, где я ошибся? Спасибо заранее!

ответ

2

d3.csv фактически returns a useful value, который может быть использован для присоединения соответствующих обратных вызовов. Однако, поскольку у getThingsнет, есть оператор return, то при вызове он всегда будет давать неопределенные значения.

Помните, что returnотносится к ближайшей закрытой функции, включая анонимные функции, такие как предоставленный обратный вызов.

function getThings(code) { 
    /* Without an explicit return, a function always evaluates 
     to undefined when invoked. */ 
    return d3.csv("data.csv", function(data){ .. }); 
}) 

var test = getThings(..); 
/* Now test is NOT undefined, but is also NOT the data 
    for the asynchronous reasons discussed elsewhere. 
    See the link above for correct usage. */ 
test.row(..); 
1

d3.csv() is асинхронный. Это означает, что функция getThings() пинает d3.csv() и мгновенно возвращает undefined

От d3 documentation:

выдает запрос GET НТТР для разделенных запятыми (CSV-файл) по указанному URL-адресу. Содержимое файла считается RFC4180-совместимым. Тип mime запроса будет «text/csv». Запрос обрабатывается асинхронно,, так что этот метод возвращает сразу после открытия запроса.

+0

Хотя true, если OP использовал функцию 'return' в функции getThings,' test' было бы присвоено не неопределенное значение (но не данные). – user2864740

+1

Справа. Если бы он выполнял 'return d3.csv()', мы бы вернули, скорее всего, обещание. – xbonez

0

Это происходит из-за Javascript Async Nature. Используйте функцию Callback.

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