PDA

View Full Version : سوال: انتظار حلقه تا دریافت کال بک در پست



id1385
یک شنبه 03 شهریور 1392, 18:03 عصر
با سلام
دوستان برای اینکه حلقه منتظر دریافت پاسخ و اتمام پست بمونه باید چکار کرد؟ من حلقه رو که شروع می کنم بدون توجه به اینکه هنوز پردازش قبلی تموم شده باشه پردازشهای بعدی هم انجام می شه و پاسخهای دریافتی همشون باهم یا هم دوتا سه تا باهم دریافت می شن.

به مثال زیر توجه فرمایید:

for(var i = 0; i <= 5; i++){
var toPost = 'Search_'+i;
$.post('functions.php',{ toPost },function(Data){
var ret = Data.split(':');
if(ret[0]=='ok'){
/*do somthing*/
}else{
/*do somthing*/
}
});
/*mikham ta moghei ke call back nayoomade halghe montazer bemone na inke jadid ro beferste*/
}


توی مثال بالا قبل از اینکه کالبک من از پست بگیرم حلقه ادامه ی مسیرشو میرم که طبیعیه، ولی من چکار میتونم انجام بدم که منتظر دستور بمونه و خودش نره مثل next که توی win app ها توی حلقه ها استفاده میشه!!!
خیلی ضروریه ممنونم.

azamicu
یک شنبه 03 شهریور 1392, 18:23 عصر
سلام دوست عزیز
شما توی تابت یه مقداری رو باید return بکنی
و توی حلقت تابت رو اینطور صدا بکنی و چک کنی اگه مقدارش اونی که میخوای بود ادامه کار رو انجام بدی
یه نمونه کوچیک:

function s1() {
// your code

return 1;
};


for (i=0;i>cunter;i++){
// your code

a=f1();
if(a===1){
// next code
}
}

jalil_gh
یک شنبه 03 شهریور 1392, 21:42 عصر
شما میتونید اینطوری بنویسید.
var i = 0,
len = 5;

function get() {

var toPost = 'Search_'+i;
$.post('functions.php',{ toPost },function(Data){
var ret = Data.split(':');
if(ret[0]=='ok'){
/*do somthing*/
}else{
/*do somthing*/
}

if (i < len) {
i++;
get();
}

});

}
ولی اگه بخوایید همه رو باهم بفرستید ولی به ترتیب دریافت کنید قضیه فرق میکنه.

mehdi.mousavi
پنج شنبه 07 شهریور 1392, 08:15 صبح
سلام.
@id1385 (http://barnamenevis.org/member.php?79574-id1385): این کاری که دارید انجام میدید، صحیح نیست. مطلقا دلیلی نداره شما در یک حلقه چندین درخواست یکسان رو به سمت سرور و بصورت مجزا، ارسال کنید. میدونید چقدر Performance برنامه پایین میاد؟ روش صحیح انجام این کار، این هستش که توی حلقه، کلیه اطلاعاتی که نیاز دارید به سمت سرور با درخواستتون ارسال کنید رو بصورت یک JSON Object در بیارید، سپس با یک بار فراخوانی $.post اون اطلاعات رو به سمت سرور ارسال کنید، سرور بر اساس اطلاعات دریافتی پاسخ رو به تفکیک و بشکل یک JSON Object به Client برگردونه و شما در Callback مربوطه، توی یه حلقه، دونه به دونه پاسخ ها رو بررسی کنید و کارو به اتمام برسونید.

البته روش های دیگه ای هم وجود داره، بطور مثال شما می تونید از $.ajax استفاده کنید (بجای $.post) و اونو برای فراخوانی بشکل Synchronized با ست کردن یک Property برنامه ریزی کنید. بدین ترتیب تا وقتی پاسخ اولین درخواست نرسیده باشه، سیستم سراغ اجرای کدهای بعدی نخواهد رفت (که 100% با انجامش موافق نیستم). روش سومی هم وجود داره. اونم اینکه کل درخواست ها رو به سمت سرور بصورت همزمان ارسال کنید، سپس با استفاده از promise object ای که برمیگرده وقتی متوجه شدید که object state به وضعیت fullfilled تغییر وضعیت داده، اونوقت با پاسخ های دریافتی کار رو ادامه بدید. اما بطور کلی، روش یک بر هر سه روش ارجحیت داره، چون فقط یک درخواست به سمت سرور ارسال خواهد شد.

موفق باشید.