Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

אוף טופיק - לולאה סינכרונית ב js

Anonymous - 07/08/2017 - 11:04
נושא ההודעה: לולאה סינכרונית ב js
אני צריך לבצע בקשות http בסדר מסויים (רק כשמתקבלת תשובה אפשר להמשיך לבאה) לפי מערך כתובות שיש לי.
גוגל אומר - רקורסיה. ואני שואל - ברצינות? זה הכי טוב שלך js ?
mksoft - 07/08/2017 - 11:11
נושא ההודעה:
אם אתה משתמש בספריית promises כלשהי, כגון:


אפשר פשוט להחזיר promise מה-then של ה-promise הקודם ואז לשרשר אותם בצורה קלה יותר.

ראה לדוגמה:
https://github.com/kriskowal/q#chaining
Anonymous - 07/08/2017 - 11:47
נושא ההודעה:
- האופציה הבסיסית זה לעשות callbacks בשרשרת אבל זה קוד די נוראי
- אפשר להשתמש ב-promise כמו שמאיר הציע
- הפתרון הכי מודרני זה async/await אם יש תמיכה בזה בסביבה שאתה עובד בה או להעביר את הקוד דרך babel
Anonymous - 07/08/2017 - 12:07
נושא ההודעה:
אולי לא הבנתם.
אני מדבר על מערך של מאה כתובות, לא שתים שלוש.
אני עובד עם node וצריך לשלוח http post נגיד ... לטלפוני ה voip אצלי באירגון. ויש לי מערך של הIP ים שלהם. (לצורך העניין אני חייב את זה סינכרוני. בקשה אחת פר זמן נתון.)
או אולי אני לא הבנתי.
Anonymous - 07/08/2017 - 12:12
נושא ההודעה:
או נגיד .. שיש שרת שאני רוצה לשלוח אליו מאות http POST אבל לא לחנוק אותו.
לשלוח POST אחד ולנוח רבע שניה ..
mksoft - 07/08/2017 - 12:45
נושא ההודעה:
אתה יכול לבנות לולאה על המערך, באותו עמוד שקישרתי לעיל, ראה גם sequences:
https://github.com/kriskowal/q#sequences
Anonymous - 07/08/2017 - 13:15
נושא ההודעה:
mksoft :
אתה יכול לבנות לולאה על המערך, באותו עמוד שקישרתי לעיל, ראה גם sequences:
https://github.com/kriskowal/q#sequences

סליחה שמיהרתי לפסול. נראה פיתרון הולם.
(ארררג! פיכסה של שפה Sad )
Anonymous - 07/08/2017 - 21:39
נושא ההודעה:
http://caolan.github.io/async/docs.html#eachLimit
ינון - 08/08/2017 - 12:12
נושא ההודעה:
מצטרף לתשובה הפופולרית - Promises. יש ב JS פקודת await שמחכה לביצוע Promise, ואפשר ללכת בשני כיוונים:

1. אם הסדר חשוב נבצע כל Promise ואז נתחיל את הבא אחריו. זה יראה בערך כך:

קוד:

// define an array of urls
const urls = [...];

function downloadAllInOrder() {
  for (let url of urls) {
    const res = await fetch(url);
    const body = await res.text();
    console.log(body);
  }
}



2. אם הסדר לא חשוב אפשר ליצור Promise יחיד מכל המערך ואז כל הבקשות מבוצעות במקביל. זה יראה בערך כך:

קוד:

// define an array of urls
const urls = [...];

function downloadAllInOrder() {
  const responses = await Promise.all(urls.map(fetch));
  const bodies    = await Promise.all(responses.map(r => r.text()));

  // now bodies is an array of all the responses
  console.log(bodies[2]);
}



לא בדקתי אף אחת מהפונקציות אז ייתכנו אי דיוקים.
כל הזמנים הם GMT + 2 שעות