функция JavaScript с $ .get не будет возвращать значение - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть следующая функция:

function parseLink(link){
 var newlink="";

 $.get(link,
   function(data){    

   startoffset = data.indexOf("location.replace") + 18;
   endoffset = data.indexOf("tiny_fold = 1;") - 8;
   newlink= data.substr(startoffset,(endoffset-startoffset));


});

return newlink;

 }

Я использую jquery $ .get для разбора URL, который работает нормально, если я делаю это без функции, но функция вернет пустую строку,Очевидно, я делаю что-то не так, но я не знаю, что;любая помощь будет высоко ценится.

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

Вам нужно будет передать функцию, которая будет вызываться при возврате $.get. Что-то вроде:

function parseLink(link, callback) {
   $.get(link,
      function(data) {
         startoffset = data.indexOf("location.replace") + 18;
         endoffset = data.indexOf("tiny_fold = 1;") - 8;
         var newlink= data.substr(startoffset,(endoffset-startoffset));
         callback(newlink);
      });
 }

Тогда вы можете позвонить с помощью:

parseLink('foo', function (newlink)
  {
     //Stuff that happens with return value
  }
);
3 голосов
/ 21 декабря 2011

Вызов $ .get является асинхронным. Посмотрите поток управления так:

parseUrl("http://www.test.com")
$.get(..., function callback() { /* this is called asynchronously */ })
return "";
... 
// sometime later the call to $.get will return, manipulate the
// newLink, but the call to parseUrl is long gone before this
callback();

Я думаю, что вы хотели сделать:

function parseUrl(link, whenDone) {
    $.get(link, function () {
        var newLink = "";
        // Do your stuff ...
        // then instead of return we´re calling the continuation *whenDone*
        whenDone(newLink);
    });
}

// Call it like this:
parseUrl("mylink.com", function (manipulatedLink) { /* ... what I want to do next ... */ });

Добро пожаловать в мир асинхронных спагетти:)

0 голосов
/ 21 декабря 2011

Поскольку .get() работает асинхронно, parseLink() продолжает выполнение и возвращает пустое newlink до возвращения вызова AJAX.

Вам нужно будет вызвать все, что работает с newlink, из обратного вызова, что может потребовать от вас немного переосмыслить реализацию. Что будет дальше (что должно произойти с населением newlink)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...