Переменный в setinterval не видно вне него
Вопрос следующий. Вот у меня есть аякс запрос, который выполяется раз в секунду. Функция внутри запроса возвращает какое то значение.
setInterval(function test(){
var t;
$.ajax({
type: "POST",
url: "/mnemo_1.php",
//data: "func=1",
dataType: "text",
async: false,
success: function (data){t = data;},
error: function(){alert('Problem');}
}).responseText;
return t;
}, 1000);
s1 = test();
/// далее идет функция внутри которой я использую значение из setinterval
draw2d.MyWorkflow.prototype.getContextMenu=function()
{
var menu =new draw2d.Menu();
var oThis = this;
menu.appendMenuItem(new draw2d.MenuItem("Насос", null,function(x,y,s1)
{
var s1 = new draw2d.Server("any_pkey1",ВОТ СЮДА НАДО РАЗ В СЕК ВСТАВЛЯТЬ ЗНАЧЕНИЕ, "up");
oThis.addFigure(s1, x, y);
}));
return menu;
}
проблема в том, что все объявленный переменные, функции и тп внутри setinterval не видно ВНЕ него. Так как же работать со значениями которые я в нем получаю. Говорить мне писать код в success мне не надо ибо у меня много функций который будут использовать это значение. |
Цитата:
По теме: http://javascript.ru/basic/closure |
Цитата:
|
|
Цитата:
|
Всетаки по прежнему функцию test и переменные внутри setinterval он не видит в дальнейшем.
|
setInterval(function test(){
t=0;
$.ajax({
type: "POST",
url: "/mnemo_1.php",
//data: "func=1",
dataType: "text",
async: false,
success: function (data){t = data; },
error: function(){alert('Problem');}
}).responseText;
return t;
}, 1000);
sss = t;
Вот так он будет ругатся что t не видит. Если вместо t написать test() то тоже напишет что не видит. |
вы выполняете строчку sss = t; до того, как будет послан первый запрос.
как только первый запрос будет выполнен, вам будет доступно необходимое вам значение t |
Цитата:
|
ну, так вызывайте код, использующий t после того, как он будет известен.
если по какой-то сферической причине, вы не хотите использовать колбеки, то сперва один раз вызовите синхронный AJAX, а затем выставьте выполнение последующих запросов в setInterval. таким образом, сразу за этим кодом уже известно значение t |
и, да
return t; - не нужен |
ну я понел. То есть придется 2 запроса делать всегда. Но вот в этом случае
$.ajax({
type: "POST",
url: "/mnemo_1.php",
//data: "func=1",
dataType: "text",
async: false,
success: function (data){this.label = new draw2d.Label(data);},
error: function(){alert('Problem');}
}).responseText;
this.label.setCanDrag(false);
он будет ругатся на последнюю строчку что this.label не находит. Про коллбеки я читал но что то материал про них тут не очень изложен и я плохо понел их приминение. |
http://api.jquery.com/jQuery.ajax/
конечно он будет ругаться куда тут указывает this ??? на анонимную функцию!
function (data){this.label = new draw2d.Label(data);}
а тут? на window ? this.label.setCanDrag(false); тогда лучше так
var label
$.ajax({
type: "POST",
url: "/mnemo_1.php",
//data: "func=1",
dataType: "text",
async: false,
success: function (data){label = new draw2d.Label(data);},
error: function(){alert('Problem');}
}).responseText;
label.setCanDrag(false);
а еще лучше засунуть все в колбек
var label
$.ajax({
type: "POST",
url: "/mnemo_1.php",
//data: "func=1",
dataType: "text",
async: false,
success: function (data){label = new draw2d.Label(data);label.setCanDrag(false);},
error: function(){alert('Problem');}
}).responseText;
|
| Часовой пояс GMT +3, время: 04:27. |