PDA

View Full Version : مشکلی چیده در یک تابع ساده ایجکسی!



ehsaun_kkt
چهارشنبه 09 تیر 1395, 07:09 صبح
سلام

مشکل اینجاست : میخوام مقداری رو که function مربوط به success بر میگردونه رو در تابع والد استفاده کنم ، اینم کد:



function get_option(id)
{

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}});
$.ajax({
url:'<?= $url ?>',
type:"post",
data:'id='+id,
success: function(data)
{


var data=$.parseJSON(data);


}


});

اینجا میخوام از مقدار data استفاده کنم.

alert(data);

}

ehsaun_kkt
چهارشنبه 09 تیر 1395, 09:04 صبح
کسی از دوستان نظری نداره؟

alireza_s_84
چهارشنبه 09 تیر 1395, 10:16 صبح
سلام

مشکل اینجاست : میخوام مقداری رو که function مربوط به success بر میگردونه رو در تابع والد استفاده کنم ، اینم کد:



function get_option(id)
{

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}});
$.ajax({
url:'<?= $url ?>',
type:"post",
data:'id='+id,
success: function(data)
{


var data=$.parseJSON(data);


}


});

اینجا میخوام از مقدار data استفاده کنم.

alert(data);

}


از اونجا که درخواست ایجکس بصورت غیرهمزمان ارسال میشه برای همین شما نمیتونی بیرون تابع ایجکس از اون مقدار قبل از اینکه درخواست تکمیل بشه استفاده کنی. در این مثال درخواست شما ارسال میشه ولی اجرای کد متوقف نمیشه و قبل از رسیدن پاسخ دستور alert اجرا میشه.
یا دستور alert رو به تابع success انتقال بدین یا با استفاده از callback بعد از اتمام درخواست و دریافت نتیجه پیامتون رو نشون بدین.

ehsaun_kkt
چهارشنبه 09 تیر 1395, 21:17 عصر
یا دستور alert رو به تابع success انتقال بدین یا با استفاده از callback بعد از اتمام درخواست و دریافت نتیجه پیامتون رو نشون بدین.

ممنون بابت پاسختون ، ببنید من هدفم اینه که مقدار data=$.parseJSON(data) رو به یک تابع دیگه ارسال کنم:

اگه از روش callback استفاده کنم چطوری باید هنگام فراخوانی تابع مقدار data رو که پس از success شدن درون فانکشنش بهش تعلق میگیره رو بهش بدم؟

من میخوام یه کاری کنم که تابع اصلی get_option مقداره پارس شده جیسون رو که درون فانکش ایجکس هست رو برگردونه. راهی هست؟

ehsaun_kkt
چهارشنبه 09 تیر 1395, 21:21 عصر
در واقع اون تابع ایجکس داره برام مقادیر option یه تگ select رو میسازه که من میخوام این مقادیر رو به یک فانکشن دیگه ارسال کنم همین!

ehsaun_kkt
چهارشنبه 09 تیر 1395, 22:53 عصر
کسی اطلاعی نداره؟

یعنی تا حالا برای کسی پیش نیومده که بخواد اطلاعات دریافتی ایجکس رو به یک تابع دیگه ارسال کنه؟؟؟؟؟؟؟؟؟

ehsaun_kkt
چهارشنبه 09 تیر 1395, 23:42 عصر
طبق معمول خودم باید راه حل رو پیدا کنم =» یه متغیر خالی بیرون از تابع ایجکس ایجاد میکنیم و درون تابع ایجکس مقدار دهیش میکنیم و بعد از اون متغیر استفاده میکنیم یا returnش میکنیم! به همین راحتی :)




function get_option(id)
{

var show="";
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}});
$.ajax({
url:'<?= $url ?>',
type:"post",
data:'id='+id,
success: function(data)
{
show=data;
}
});


//alert(data);
return show;
{

plague
چهارشنبه 09 تیر 1395, 23:49 عصر
ارسال کردن دیتا برای تابع دیگه که کاری نداره
آیا منظور شما اینه که یک تابع A این تابع B رو که توش کد ایجکس قرار داره اجرا میکنه
و قراره تابع B نتیجه ایجکس رو برگردونه به A ؟

اگه اینجوریه شما به مشکل برمیخوری به دلیل ASYNC بودن درخواست ایجکس ولی راه حل های نه چندان تر و تمیزی وجود داره مثلا یه متغیر گلوبال تعریف میکنی بیرون از 2 تابع و یه مقدار اولیه مثل false بهش میدی و تابعی که ایجکس داره مقدار دهی میکنه این رو ... حالا تابع اول میاد هر ثانیه چک میکنه این متغیر رو که مقدار جدید گرفته یا همون مقدار اولیه رو داره



var ajax_result = false ;
function A(){
B();
var loop = setInterval(function(){
if(ajax_result)
{
clearInterval(loop);
// do stuff with ajax_result
}
}, 1000);
}
function B(){
// ajax call (data){
ajax_result = data ;
}
}



پستمون همزمان شد شما تقریبا پیدا کردی جواب رو ولی این کدی که نوشتی احتمالا فقط رو لوکال خودت جواب میده روی سرور ه سرعت درخواست ایجکس کند تره قبل از اینکه ایجکس نتیجش برگرده return میکنه و خالی برمیگردونه

ehsaun_kkt
پنج شنبه 10 تیر 1395, 01:30 صبح
شما تقریبا پیدا کردی جواب رو ولی این کدی که نوشتی احتمالا فقط رو لوکال خودت جواب میده روی سرور ه سرعت درخواست ایجکس کند تره قبل از اینکه ایجکس نتیجش برگرده return میکنه و خالی برمیگردونه

ببینید کدی که من نوشتم اینطوری شد و async: false, الان روی لوکال خیلی خوب کار میده . بنظر شما روی سرور مقدار خالی برمیگردونه؟ یه راه اصولی سراغ ندارید؟


function get_option(id)
{
var show="";

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}});
$.ajax({
url:'<?= $url3 ?>',
type:"post",
data:'id='+id,
async: false,
success: function(data)
{


data=$.parseJSON(data);


show='<select name="child_item_'+id+'" value="'+id+'" class="form-control">';
for (var i in data)
{
show+='<option value="'+data[i].id+'">'+data[i].title+'</option>';


}
show+='</select>';
}
});


return show;


}

plague
پنج شنبه 10 تیر 1395, 03:08 صبح
نه اگه async رو false کنی باید حل بشه من فکر کردم شما هنوز داری async اجرا میکنی کد رو
ولی خب async بودن ایجکس از بین میره که اگه برای شما مهم نباشه راه ساده همینه دیگه نمیخاد انقد پیچ و تاب بدی (از بس به ندرت استفاده میکنیم از این به فکرمون نرسید پیشنهاد بدیم ! )

کد های sync خط به خط اجرا میشن
کد های async ولی خط به خط اجرا نمیشن ... مثلا
خط یک اجرا میشه
خط دو درخواست ایجکس هست ارسال میشه ولی چون طول میکشه تا بره و جوابش بیاد سیستم از بقیه کدهای مربوط به این خط میگزره
و میره خط 3 رو اجرا میکنه که توی اینجا شما return میکنی چیزی رو (یا تابع به پایان میرسه )
وقتی جواب ایجکس بعد از این عملیات میرسه کدش پروسس میشه ولی تابع دیگه تمام شده و نتیجش رو ارسال کرده به صدا کنندش پس این کد اثری روی نتیجه خروجی تابع نخواهد داشت

یه تست ساده میتونی بکنی توی کد php که درخواست ایجکس بهش ارسال میشه از تابع sleep استفاده کن تا جواب دادن رو طول بده و یجورایی شرایط سرور رو شبیه سازی کن مثلا اول کد بزار sleep(5) اینجوری php حداقل 5 ثانیه طولش میده بعد جواب رو میفرسته