2013-11-26 2 views
2

Пожалуйста, помогите - у меня есть следующий код, который возвращает переменную 'results' в предупреждении. Я хочу использовать эту переменную вне функции и не могу получить обратный вызов или внешнюю декларацию для успешной работы. Я уверен, что я будучи Muppet, поэтому прошу прощения за этот основной вопрос .....Передача переменной вне функции ajax

<script src='http://code.jquery.com/jquery-1.9.1.js'></script> 
<script> 

$(function() { 
    $.ajax({ 
     type: 'POST', 
     dataType: 'jsonp', 
     url: 'https://creator.zoho.com/api/json/my-company-culture/view/PageFeed_Report?scope=creatorapi&authtoken=d670dc68ac0f6d7ca389e7b206a25045', 
     success: function (results) { 
      var raw_result=JSON.stringify(results); 
      alert(results); 
     } 
    }); 
}); 

</script> 
+0

Можем ли мы видеть ваши обратные вызовы, которые не работают? – villecoder

+0

Вы пробовали объявить функцию успеха вне $ .ajax? – otherDewi

+0

'' POST "и' 'jsonp" 'никогда не должны быть в одном вызове' $ .ajax'. –

ответ

3

JQuery 1.5+ способ решения этого является использование отсроченных объектов:

var res; 

var ajax = $.ajax({ 
    type: 'POST', 
    dataType: 'jsonp', 
    url: ... 
}).done(function(results) { 
    // you may safely use results here 
    res = results; 
    ... 
}); 

// you cannot safely use 'res' here, only in code 
// invoked via a 'done' callback on the `$.ajax` promise 

console.log(res); // undefined 

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

+0

Это работает и выглядит намного опрятно, чем исходный код, но я не знаю, как использовать переменную «results» в другом месте моего скрипта. – MarkE

+0

@MarkE все дело в том, что вы _can't_! Если другой материал зависит от «результатов», он должен передаваться как параметр функции, вызванной из обратного вызова. В качестве альтернативы вам необходимо установить, что любой код, который будет использовать это значение, не может быть вызван до тех пор, пока не будет завершен обратный вызов '.done'. – Alnitak

+0

Я знаю это не чистым - но я исправил свою проблему, используя результаты, чтобы заполнить и открыть новую страницу - восстановить переменные из URL-адреса так же, как использовать пост. Он сделал именно то, что мне нужно было сделать в этой форме, - и я не мог бы сделать это без всякой помощи. Большое спасибо. – MarkE

-1

Я не уверен, что это хорошо, но просто сохраните его в глобально определенной переменной.

var global; 

$(function() { 
    $.ajax({ 
     type: 'POST', 
     dataType: 'jsonp', 
     url: 'https://creator.zoho.com/api/json/my-company-culture/view/PageFeed_Report?scope=creatorapi&authtoken=d670dc68ac0f6d7ca389e7b206a25045', 
     success: function (results) { 
      var raw_result=JSON.stringify(results); 
      global = results; 
     } 
    }); 
}); 

Лучшее решение - передать его функции, в которой вы нуждаетесь, чтобы перейти к ней.

success: function (results) { 
     var raw_result=JSON.stringify(results); 
     doMoreThings(results); 
    } 
+1

Это именно то, о чем @Alnitak советует в своем ответе, потому что вы никогда не можете гарантировать, что «глобальный» фактически заселен. – Steve

+0

Это одна из причин, почему я не понимаю, почему, потому что вам нужно будет ее проверять ... if (global) {/ * заполняется * /} else {/ * global undefined * /} ... in Кроме того, могут возникать утечки памяти. http://www.javascriptkit.com/javatutors/closuresleak/index2.shtml Хотя его только около 20 байтов данных в области ajax. – Wayne

+0

Как бы вы «продолжаете проверять его»? Использовать тайм-аут? Цикл 'while'? Как вы знаете, что ** будете ** иметь ценность в глобальном масштабе? Единственный безопасный способ полагаться на любые асинхронно полученные данные - это доступ к нему из обратного вызова (или обещания). – Steve

3

Ну, почему бы и нет:

<script src='http://code.jquery.com/jquery-1.9.1.js'></script> 
    <script> 
    function do_the_stuff(smth) { 
     console.log(smth);//or do whatever you want to do with this data 
    } 
    $(function() { 
     $.ajax({ 
      type: 'POST', 
      dataType: 'jsonp', 
      url: 'https://creator.zoho.com/api/json/my-company-culture/view/PageFeed_Report?scope=creatorapi&authtoken=d670dc68ac0f6d7ca389e7b206a25045', 
      success: function (results) { 
       var raw_result=JSON.stringify(results); 
       do_the_stuff(results); 
      } 
     }); 
    }); 

    </script> 

Это отлично работает для меня. Я не вижу никаких проблем.

+0

Если я изменю console.log (smth); предупреждать (см.); Я просто получаю объект Object Object ... – MarkE

+0

Так что измените его на 'alert (JSON.stringify (smth))' ИЛИ ​​передайте 'raw_result' вместо 'results' для работы. – haldagan

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