דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מחלקת "תכנות נורמלי במערכות 'ימות'..."

מחלקת "תכנות נורמלי במערכות 'ימות'..."

מתוזמן נעוץ נעול הועבר תכנות
57 פוסטים 6 כותבים 1.6k צפיות 4 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY yossiz

    @MusiCode איפה בבקשה של ימות אתה מקבל את מזהה השיחה?

    nigunN מנותק
    nigunN מנותק
    nigun
    כתב ב נערך לאחרונה על ידי
    #11

    @yossiz
    הוא שכח לציין שימות מוסיף לסטרינג ערכים קבועים כמו מספר טלפון,מספר שלוחה ,ומזהה שיחה יחודי

    מייל: nigun@duck.com

    תגובה 1 תגובה אחרונה
    2
    • MusiCodeM MusiCode

      @nigun לא התכוונתי לעשות ווב-סוקט...
      רק שאם שם יש אופציה של קטע קוד שמבוצע בהתאמה לכמה קריאות (שם - ווב-סוקט, כאן - בקשות HTTP), אז זה בדיוק מה שרציתי.

      התחיל להתבשל לי רעיון,
      ליצור אינטרפייס לכל מזהה, לשים את כולם במערך,
      ואז - אם המזהה שולח בקשה פעם שנייה, פשוט להפעיל איזה קולבק באינטרפייס הספיציפי שלו.

      ואז אפשר לכתוב קוד שכולו מבוסס קולבקים (מושג שלמדתי לפני יומיים...), ולכל אינטרפייס זה ירוץ בנפרד.

      זה עדיין בוסר, ואת נוד אני מכיר מאתמול.
      אז אם מישהו שמכיר את נוד טיפה יותר יעזור לפתח את זה, אני אשמח.

      nigunN מנותק
      nigunN מנותק
      nigun
      כתב ב נערך לאחרונה על ידי
      #12

      @MusiCode
      אני בור בנוד
      אבל אולי אני אלמד מזה משהו

      1. מה אתה מתכוון ב"ליצור אינטרפייס לכל מזהה"?
      2. איך הקוד הא-סינכרוני עוזר לך מתי שאתה סך הכל צריך להחזיר משפט פשוט בלי שום תהליך מקביל?
        (אני מכיר קוד א-סינכרוני בgo אולי בנוד זה עובד אחרת)

      מייל: nigun@duck.com

      תגובה 1 תגובה אחרונה
      0
      • MusiCodeM MusiCode

        @dovid אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

        האשכול מניח שכולם מבינים פה מה זה ימות ואיך עובדים עם זה. זה הנחה לגיטימית אבל שמפסידה חלק מהעונים.

        @MusiCode אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

        אלו הנתונים:
        המשתמש נכנס לשלוחה, והשלוחה שולחת בקשה לשרת, "מה לעשות איתו?".
        השרת עונה תשובה, השלוחה מבצעת, ומיד שלוחת שוב בקשה - "ומה עכשיו?" עם נתוני הפעולה הקודמת.
        בכל בקשה, נשלח מזהה השיחה של המשתמש, המשתנה בכל שיחה למערכת.

        עוד הרחבה?
        בבקשה.
        המשתמש נכנס לשלוחה מסויימת.
        מיד השלוחה שולחת בקשה לשרת שלי, ואת הפקודה שאני אתן, היא תבצע למאזין (השמעת קובץ, או קבלת הקשות).
        איך שיסתיים ביצוע הפקודה, היא שולחת עוד בקשה, לפקודה חדשה שתבוצע.
        את התוצאות אם יש מהפקודה הקודמת, היא שולחת כפרמטרי GET בבקשה החדשה.
        זה נראה ככה:
        בקשה ראשונה: https://call2yemot.com/ext
        התשובה: read=f-000=ivr,n,...
        (המילה הראשונה read היא מסמנת קבלת הקשות. אח"כ, שם הקובץ שיושמע כתפריט. אח"כ שם המשתנה שיוחזר)
        בקשה שנייה: https://call2yemot.com/ext?ivr=2
        המאזין הקיש שתיים.
        נענה לו: go_to_folder=/1/5
        לך לשלוחה 1/5.

        החזון שלי, שתהיה מחלקה שתטפל בכל זה, ואנחנו נוכל לכתוב שלוחות נורמליות, עם רצף של פקודות, שיצבצעו בזו אחר זו, כמו הקוד למעלה.

        MusiCodeM מנותק
        MusiCodeM מנותק
        MusiCode
        כתב ב נערך לאחרונה על ידי MusiCode
        #13

        @MusiCode אמר ב[מחלקת "תכנות נורמלי במערכות

        זה נראה ככה:
        בקשה ראשונה: https://call2yemot.com/ext
        התשובה: read=f-000=ivr,n,...
        (המילה הראשונה read היא מסמנת קבלת הקשות. אח"כ, שם הקובץ שיושמע כתפריט. אח"כ שם המשתנה שיוחזר)

        למעשה הבקשה הראשונה נראית כך:
        https://call2yemot.com/ext?ApiPhone=0504100000&ApiCallId=b6t76r7v6v4754c
        71a48d6b-e5da-4923-a8e9-858c20ed1227-image.png

        nigunN תגובה 1 תגובה אחרונה
        1
        • MusiCodeM MusiCode

          @MusiCode אמר ב[מחלקת "תכנות נורמלי במערכות

          זה נראה ככה:
          בקשה ראשונה: https://call2yemot.com/ext
          התשובה: read=f-000=ivr,n,...
          (המילה הראשונה read היא מסמנת קבלת הקשות. אח"כ, שם הקובץ שיושמע כתפריט. אח"כ שם המשתנה שיוחזר)

          למעשה הבקשה הראשונה נראית כך:
          https://call2yemot.com/ext?ApiPhone=0504100000&ApiCallId=b6t76r7v6v4754c
          71a48d6b-e5da-4923-a8e9-858c20ed1227-image.png

          nigunN מנותק
          nigunN מנותק
          nigun
          כתב ב נערך לאחרונה על ידי
          #14

          @MusiCode
          ליתר דיוק
          ApiCallId=0b1b92e09984f1d6f200e3190b805a6ab0625f68&ApiDID=0773137777&ApiRealDID=0773137777&ApiPhone=0504100000&ApiExtension=5/1

          מייל: nigun@duck.com

          תגובה 1 תגובה אחרונה
          1
          • yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי yossiz
            #15

            @MusiCode מה שאתה צריך הוא מימוש של generator coroutines .

            משהו כזה:

            var activeCalls = {};
            
            function router(req, res) {
                var callId = getCallId(req);
                var currentCall = activeCalls[callId];
                if (currentCall) {
                    var returnedValue = extractValue(req);
                } else {
                    currentCall = activeCalls[callId] = Call();
                    returnedValue = null;
                }
                var reply = currentCall.next(returnedValue);
                return res.send(reply.value);
            }
            
            function* Call() {
                yield playfile("file");
                var f = yield read("file", 1, 5, ...);
                yield goToFolder("/7/" + f);
                yield hangup();
            }
            

            אני לא מצרף מימוש של playfile, read, gotofolder, hangup כי אין לי מושג איך ה-API של ימות עובד. אבל כל אחד מפונקצייות אלו אמור להחזיר את המחרוזת שצריך להשיב למערכת ימות

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            MusiCodeM תגובה 1 תגובה אחרונה
            4
            • yossizY מנותק
              yossizY מנותק
              yossiz
              כתב ב נערך לאחרונה על ידי
              #16

              בהמשך להנ"ל,
              בינתיים השתמשתי רק בקוד סינכרוני בתוך פונקציית call. אבל בחיים האמתיים תצטרכו מן הסתם קוד איסינכרוני.
              מאז נוד 10 ומעלה אפשר להשתמש ב-Asynchronous generators.
              זה נראה כך,

              var activeCalls = {};
               
              async function router(req, res) {
                  var callId = getCallId(req);
                  var currentCall = activeCalls[callId];
                  if (currentCall) {
                      var returnedValue = extractValue(req);
                  } else {
                      currentCall = activeCalls[callId] = Call();
                      returnedValue = null;
                  }
                  var reply = await currentCall.next(returnedValue);
                  return res.send(reply.value);
              }
               
              async function* Call() {
                  yield playfile("file");
                  var f = yield read("file", 1, 5, ...);
                  yield goToFolder("/7/" + f);
                  yield hangup();
              }
              

              אני מקווה ללמוד יותר את ה-API של ימות ואז אוכל להביא משהו יותר מושלם.

              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

              תגובה 1 תגובה אחרונה
              4
              • yossizY מנותק
                yossizY מנותק
                yossiz
                כתב ב נערך לאחרונה על ידי yossiz
                #17

                איזה מחרוזת שולחים כדי לסיים את השיחה בימות?
                אני מנסה לעשות סוג של hello world עם yield כדי להדגים צורת הפעולה

                @MusiCode האם הקוד הנ"ל עונה על דרישותיך? הפונקציה call נראה כמעט כמו הקוד שלך רק בתוספת המילה yield.

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                nigunN WWWW 2 תגובות תגובה אחרונה
                0
                • yossizY yossiz

                  איזה מחרוזת שולחים כדי לסיים את השיחה בימות?
                  אני מנסה לעשות סוג של hello world עם yield כדי להדגים צורת הפעולה

                  @MusiCode האם הקוד הנ"ל עונה על דרישותיך? הפונקציה call נראה כמעט כמו הקוד שלך רק בתוספת המילה yield.

                  nigunN מנותק
                  nigunN מנותק
                  nigun
                  כתב ב נערך לאחרונה על ידי
                  #18

                  @yossiz
                  החיבור יכול להסתיים במעבר לשלוחה אחרת
                  ואז לא נשלח כלום
                  ואם הלקוח ניתק את השיחה כשהוא עדיין בשלוחת API המערכת תשלח את כל הערכים שנאספו עד עכשיו בשלוחה בתוספת hangup=yes

                  מייל: nigun@duck.com

                  yossizY תגובה 1 תגובה אחרונה
                  0
                  • nigunN nigun

                    @yossiz
                    החיבור יכול להסתיים במעבר לשלוחה אחרת
                    ואז לא נשלח כלום
                    ואם הלקוח ניתק את השיחה כשהוא עדיין בשלוחת API המערכת תשלח את כל הערכים שנאספו עד עכשיו בשלוחה בתוספת hangup=yes

                    yossizY מנותק
                    yossizY מנותק
                    yossiz
                    כתב ב נערך לאחרונה על ידי yossiz
                    #19

                    @nigun אני שואל מה אני אמור לשלוח כדי לנתק את השיחה מהצד שלי?
                    (בקיצור מימוש של פונקציה בשם hangup)

                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                    nigunN תגובה 1 תגובה אחרונה
                    1
                    • yossizY yossiz

                      @nigun אני שואל מה אני אמור לשלוח כדי לנתק את השיחה מהצד שלי?
                      (בקיצור מימוש של פונקציה בשם hangup)

                      nigunN מנותק
                      nigunN מנותק
                      nigun
                      כתב ב נערך לאחרונה על ידי
                      #20

                      @yossiz
                      שולחים את המשתמש לשלוחת ניתוק
                      (לא ידוע לי על דרך אחרת)

                      מייל: nigun@duck.com

                      yossizY תגובה 1 תגובה אחרונה
                      0
                      • nigunN nigun

                        @yossiz
                        שולחים את המשתמש לשלוחת ניתוק
                        (לא ידוע לי על דרך אחרת)

                        yossizY מנותק
                        yossizY מנותק
                        yossiz
                        כתב ב נערך לאחרונה על ידי
                        #21

                        @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                        שולחים את המשתמש לשלוחת ניתוק

                        איך נראה המחרוזת שיעשה את זה? אני ממש ממש לא מכיר את מערכת ימות

                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                        nigunN תגובה 1 תגובה אחרונה
                        0
                        • yossizY yossiz

                          @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                          שולחים את המשתמש לשלוחת ניתוק

                          איך נראה המחרוזת שיעשה את זה? אני ממש ממש לא מכיר את מערכת ימות

                          nigunN מנותק
                          nigunN מנותק
                          nigun
                          כתב ב נערך לאחרונה על ידי nigun
                          #22

                          @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                          אני ממש ממש לא מכיר את מערכת ימות

                          אתה לא מפסיד כלום
                          בכל מקרה מעבר לשלוחה אחרת בPHP יראה משהו כזה

                          print "go_to_folder=../";
                          
                          

                          ואם אתה רוצה שישמע הודעה לפני המעבר

                          print "id_list_message=f-028.n-100.f-029&go_to_folder=/4&";
                          
                          

                          שזה בעצם משמיע לו את קובץ 028 ואז את המספר 100 ואז את קובץ 029 ואז עובר לשלוחה 4

                          מייל: nigun@duck.com

                          תגובה 1 תגובה אחרונה
                          0
                          • yossizY מנותק
                            yossizY מנותק
                            yossiz
                            כתב ב נערך לאחרונה על ידי
                            #23

                            @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                            print "go_to_folder=../";

                            ואז בממשק של ימות מגדירים את השלוחה שינתק?

                            אגב, לא הבנתי מה בדיוק רצית לעשות בקוד ה-GO שהבאת למעלה, אבל מימוש של coroutine הוא אפילו יותר טבעי ב-GO מאשר ב-JS. לכאורה אפשר לעשות מחלקה שעושה את השימוש בימות ממש טבעי וזורם.

                            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                            nigunN תגובה 1 תגובה אחרונה
                            0
                            • yossizY yossiz

                              @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                              print "go_to_folder=../";

                              ואז בממשק של ימות מגדירים את השלוחה שינתק?

                              אגב, לא הבנתי מה בדיוק רצית לעשות בקוד ה-GO שהבאת למעלה, אבל מימוש של coroutine הוא אפילו יותר טבעי ב-GO מאשר ב-JS. לכאורה אפשר לעשות מחלקה שעושה את השימוש בימות ממש טבעי וזורם.

                              nigunN מנותק
                              nigunN מנותק
                              nigun
                              כתב ב נערך לאחרונה על ידי nigun
                              #24

                              @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                              @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                              print "go_to_folder=../";

                              ואז בממשק של ימות מגדירים את השלוחה שינתק?

                              כן

                              אגב, לא הבנתי מה בדיוק רצית לעשות בקוד ה-GO שהבאת למעלה, אבל מימוש של coroutine הוא אפילו יותר טבעי ב-GO מאשר ב-JS. לכאורה אפשר לעשות מחלקה שעושה את השימוש בימות ממש טבעי וזורם.

                              בקוד למעלה
                              ניסיתי לשאול האם אפשר להרוג תהליך שכבר רץ מקריאה קודמת
                              אז לצורך הדוגמה בניתי שרת HTTP שקריאה לlocalhost:8000/run מפעילה את הפונקציה run(foo)
                              (אין ל פונקציה כזאת כרגע זה כדי לתת הדגמה של הפעלת תהליך)
                              וכיון שזה קריאה א-סינכרונית אני לא צריך להישאר בדף כדי שפונקציה תמשיך לרוץ
                              אבל אם הפונקציה היא אינסופית או שרצה להרבה זמן
                              אני רוצה דרך לשלוט עליה עם קריאה נפרדת
                              למשל להרוג את התהליך אחרי שעה
                              אז רציתי שיהיה אופציה בסגנון של קריאה ל localhost:8000/kill
                              שמפעילה את הפונקציה kill(foo)
                              ובעברית "להרוג את תהליך foo"
                              אבל הבעיה היא שאי אפשר להשפיע על התהליך מהקריאה הקודמת ע"י קריאה בשם של התהליך (foo)
                              אמנם אם אני מקבל בשעת ההפעלה את הPID של התהליך אז אני יכול להרוג אותו ע"י קריאה לPID
                              (לכאורה אני יכול להחליט בהפעלה מה הPID כדי שאני אוכל לגשת אליו אחר כך
                              ואם לא אפשר לקבל אותו בהפעלה ולשמור אותו איפה שהוא
                              אבל כל זה נוגע להריגת התהליך אבל להמשיך הפעלה לאותו תהליך זה כבר משהו אחר

                              מייל: nigun@duck.com

                              תגובה 1 תגובה אחרונה
                              0
                              • yossizY yossiz

                                @MusiCode מה שאתה צריך הוא מימוש של generator coroutines .

                                משהו כזה:

                                var activeCalls = {};
                                
                                function router(req, res) {
                                    var callId = getCallId(req);
                                    var currentCall = activeCalls[callId];
                                    if (currentCall) {
                                        var returnedValue = extractValue(req);
                                    } else {
                                        currentCall = activeCalls[callId] = Call();
                                        returnedValue = null;
                                    }
                                    var reply = currentCall.next(returnedValue);
                                    return res.send(reply.value);
                                }
                                
                                function* Call() {
                                    yield playfile("file");
                                    var f = yield read("file", 1, 5, ...);
                                    yield goToFolder("/7/" + f);
                                    yield hangup();
                                }
                                

                                אני לא מצרף מימוש של playfile, read, gotofolder, hangup כי אין לי מושג איך ה-API של ימות עובד. אבל כל אחד מפונקצייות אלו אמור להחזיר את המחרוזת שצריך להשיב למערכת ימות

                                MusiCodeM מנותק
                                MusiCodeM מנותק
                                MusiCode
                                כתב ב נערך לאחרונה על ידי
                                #25

                                @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                @MusiCode מה שאתה צריך הוא מימוש של coroutines.

                                משהו כזה:

                                var activeCalls = {};
                                
                                function router(req, res) {
                                    var callId = getCallId(req);
                                    var currentCall = activeCalls[callId];
                                    if (currentCall) {
                                        var returnedValue = extractValue(req);
                                    } else {
                                        currentCall = activeCalls[callId] = Call();
                                        returnedValue = null;
                                    }
                                    var reply = currentCall.next(returnedValue);
                                    return res.send(reply.value);
                                }
                                
                                function* Call() {
                                    yield playfile("file");
                                    var f = yield read("file", 1, 5, ...);
                                    yield goToFolder("/7/" + f);
                                    yield hangup();
                                }
                                

                                אני לא מצרף מימוש של playfile, read, gotofolder, hangup כי אין לי מושג איך ה-API של ימות עובד. אבל כל אחד מפונקצייות אלו אמור להחזיר את המחרוזת שצריך להשיב למערכת ימות

                                אם זה אמיתי, זה מדהים!...
                                לא הבנתי, מה זה קורוטין?
                                אפשר הסבר?

                                אני מנסה להבין את הקוד, אבל כמו שאמרתי,
                                אני בנוד מלפני כמה ימים...
                                יש לי נוד אחרון.
                                צריך איזו חבילה לזה?

                                yossizY תגובה 1 תגובה אחרונה
                                1
                                • MusiCodeM MusiCode

                                  @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                  @MusiCode מה שאתה צריך הוא מימוש של coroutines.

                                  משהו כזה:

                                  var activeCalls = {};
                                  
                                  function router(req, res) {
                                      var callId = getCallId(req);
                                      var currentCall = activeCalls[callId];
                                      if (currentCall) {
                                          var returnedValue = extractValue(req);
                                      } else {
                                          currentCall = activeCalls[callId] = Call();
                                          returnedValue = null;
                                      }
                                      var reply = currentCall.next(returnedValue);
                                      return res.send(reply.value);
                                  }
                                  
                                  function* Call() {
                                      yield playfile("file");
                                      var f = yield read("file", 1, 5, ...);
                                      yield goToFolder("/7/" + f);
                                      yield hangup();
                                  }
                                  

                                  אני לא מצרף מימוש של playfile, read, gotofolder, hangup כי אין לי מושג איך ה-API של ימות עובד. אבל כל אחד מפונקצייות אלו אמור להחזיר את המחרוזת שצריך להשיב למערכת ימות

                                  אם זה אמיתי, זה מדהים!...
                                  לא הבנתי, מה זה קורוטין?
                                  אפשר הסבר?

                                  אני מנסה להבין את הקוד, אבל כמו שאמרתי,
                                  אני בנוד מלפני כמה ימים...
                                  יש לי נוד אחרון.
                                  צריך איזו חבילה לזה?

                                  yossizY מנותק
                                  yossizY מנותק
                                  yossiz
                                  כתב ב נערך לאחרונה על ידי yossiz
                                  #26

                                  @MusiCode אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                  לא הבנתי, מה זה קורוטין?
                                  אפשר הסבר?

                                  generator coroutine הוא בדיוק החלום שלך, זה פונקציה שמפסיקה את עצמה באמצע ומחזירה ערך, ואח"כ אפשר להמשיך אותה בדיוק מהמקום שבו היא עצרה.
                                  אפשר לקבל ערך מהפונקציה על כל עצירה, ולהעביר לפונקציה ערך על כל המשך הרצה.

                                  ב-JS, עושים פונקציה כזאת עם התחביר: function*
                                  העצירה והחזרת ערך מתבצעת על ידי מילת המפתח yield.
                                  הרצת הפונקציה לא באמת מריצה אותה אלא מייצרת אובייקט מסוג generator. אפשר לקרוא generator.next כדי להריץ את השלב הבא של הפונקציה. generator.next מחזירה אובייקט בעלת 2 חברים {value: xxx, done: true/false}.

                                  טוב, אידך פירושא זיל גמור...

                                  אני מנסה להבין את הקוד, אבל כמו שאמרתי,

                                  אני בנוד מלפני כמה ימים...

                                  לאט לאט...
                                  אבל אתה לא חייב JS כי coroutine generators קיימים בהרבה שפות (לפעמים תמיכה מפורשת ולפעמים על ידי קונצים).
                                  הדבר קיים גם בפייתון, אם כי לפום ריהטא נראה שזה קצת יותר מסובך למימוש

                                  צריך איזו חבילה לזה?

                                  לא
                                  בעזה"י אעלה עוד מעט דוגמת hello world שעובד.

                                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                  nigunN MusiCodeM 2 תגובות תגובה אחרונה
                                  5
                                  • yossizY yossiz

                                    @MusiCode אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                    לא הבנתי, מה זה קורוטין?
                                    אפשר הסבר?

                                    generator coroutine הוא בדיוק החלום שלך, זה פונקציה שמפסיקה את עצמה באמצע ומחזירה ערך, ואח"כ אפשר להמשיך אותה בדיוק מהמקום שבו היא עצרה.
                                    אפשר לקבל ערך מהפונקציה על כל עצירה, ולהעביר לפונקציה ערך על כל המשך הרצה.

                                    ב-JS, עושים פונקציה כזאת עם התחביר: function*
                                    העצירה והחזרת ערך מתבצעת על ידי מילת המפתח yield.
                                    הרצת הפונקציה לא באמת מריצה אותה אלא מייצרת אובייקט מסוג generator. אפשר לקרוא generator.next כדי להריץ את השלב הבא של הפונקציה. generator.next מחזירה אובייקט בעלת 2 חברים {value: xxx, done: true/false}.

                                    טוב, אידך פירושא זיל גמור...

                                    אני מנסה להבין את הקוד, אבל כמו שאמרתי,

                                    אני בנוד מלפני כמה ימים...

                                    לאט לאט...
                                    אבל אתה לא חייב JS כי coroutine generators קיימים בהרבה שפות (לפעמים תמיכה מפורשת ולפעמים על ידי קונצים).
                                    הדבר קיים גם בפייתון, אם כי לפום ריהטא נראה שזה קצת יותר מסובך למימוש

                                    צריך איזו חבילה לזה?

                                    לא
                                    בעזה"י אעלה עוד מעט דוגמת hello world שעובד.

                                    nigunN מנותק
                                    nigunN מנותק
                                    nigun
                                    כתב ב נערך לאחרונה על ידי
                                    #27

                                    @yossiz
                                    אני לא יודע איך זה עובד בנוד
                                    אבל בגו כנראה שזה אותו דבר כי אפשר לעשות לולאה שתמשיך רק אם היא מקבלת את הערך לערוץ
                                    אבל השאלה שלי איך אתה מכניס ערכים חדשים לתהליך שרץ מהקריאה הקודמת?
                                    בא נשים לרגע בצד את הHTTP
                                    במקרה שיש לך אפליקציה שאתה מעביר לה ארגומנטים משורת הפקודה
                                    ואתה מפעיל coroutine שלא ממשיך עד שהוא מקבל את הערך yield
                                    אם תפעיל שוב את האפליקציה משורת הפקודה עם הערך yield האם התהליך הראשון ימשיך או שהוא מחכה לו בערוץ שלו הוא לא יגמר לעולם

                                    מייל: nigun@duck.com

                                    yossizY תגובה 1 תגובה אחרונה
                                    0
                                    • nigunN nigun

                                      @yossiz
                                      אני לא יודע איך זה עובד בנוד
                                      אבל בגו כנראה שזה אותו דבר כי אפשר לעשות לולאה שתמשיך רק אם היא מקבלת את הערך לערוץ
                                      אבל השאלה שלי איך אתה מכניס ערכים חדשים לתהליך שרץ מהקריאה הקודמת?
                                      בא נשים לרגע בצד את הHTTP
                                      במקרה שיש לך אפליקציה שאתה מעביר לה ארגומנטים משורת הפקודה
                                      ואתה מפעיל coroutine שלא ממשיך עד שהוא מקבל את הערך yield
                                      אם תפעיל שוב את האפליקציה משורת הפקודה עם הערך yield האם התהליך הראשון ימשיך או שהוא מחכה לו בערוץ שלו הוא לא יגמר לעולם

                                      yossizY מנותק
                                      yossizY מנותק
                                      yossiz
                                      כתב ב נערך לאחרונה על ידי yossiz
                                      #28

                                      @nigun הכל רץ בתוך תהליך אחד

                                      נדבר על גו (למרות שאני לא מכיר)
                                      על כל callid חדש אתה מריץ את הפונקציה (coroutine, שבמקרה של GO הוא גם goroutine).
                                      בתוך הפונקציה אתה דוחף לתוך ערוץ את המחרוזת שאתה רוצה להחזיר לימות, ואז אתה מחכה לקבל חזרה את הבקשה הבאה של ימות.
                                      בפונקציה הראשית, על כל בקשה מהשרת אתה מחלץ מתוכו את מזהה השיחה ודוחף את הפרמטרים לתוך הערוץ המתאים לפי מזהה השיחה, זה יגרום לפונקציה הנכונה להמשיך הרצתה.
                                      פשוט מאוד, או שאני מפספס משהו?

                                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                      nigunN תגובה 1 תגובה אחרונה
                                      1
                                      • yossizY מנותק
                                        yossizY מנותק
                                        yossiz
                                        כתב ב נערך לאחרונה על ידי yossiz
                                        #29

                                        מצו"ב דגמה פשוטה, זה אמור לעבוד (פחות או יותר).
                                        יש המון המון מה לשפר פה, אבל אפשר לקבל את הכיוון.
                                        חילקתי את זה ל-2 קבצים:
                                        yemot-api-handler.js (קוד המחלקה, ניתן לשימוש חוזר)

                                        var activeCalls = {};
                                        
                                        module.exports = class YemotAPIHandler {
                                            
                                            constructor(callHandler) {
                                                this.callHandler = callHandler;
                                            }
                                            
                                            async handle(req, res) {
                                                
                                                var callId = req.query.ApiCallId;
                                                //console.log(req.query);
                                                var currentCall = activeCalls[callId];
                                                if (currentCall) {
                                                    var returnedValue = currentCall.getRetValue(req.query);
                                                } else {
                                                    console.log(this);
                                                    currentCall = activeCalls[callId] = new yemotCall(req.query, this.callHandler);
                                                    returnedValue = null;
                                                }
                                                var reply = await currentCall.controller.next(returnedValue);
                                                console.log(reply);
                                                return res.send(reply.value);
                                            }
                                        }
                                        
                                        class yemotCall {
                                            constructor(query, callHandler) {
                                                this.ApiCallId = query.ApiCallId;
                                                this.ApiPhone = query.ApiPhone;
                                                this.controller = callHandler(this);
                                            };
                                        
                                            read(data, replyVar) {
                                                this.expect = replyVar;
                                                return `read=${data}=${replyVar}`;
                                            }
                                            
                                            goToFolder(folder) {
                                                return `go_to_folder=${folder}`;
                                            }
                                            
                                            getRetValue(query) {
                                                if (this.expect && query[this.expect])
                                                return query[this.expect];
                                                this.expect = null;
                                            }
                                        }
                                        

                                        simple-yemot-sample.js

                                        const express = require('express');
                                        const app = express();
                                        const port = 3000;
                                        const hangupExtension = "";
                                        
                                        const YemotAPIHandler = require("./yemot-api-handler.js");
                                        
                                        async function* callHandler(call) {
                                            var input = yield call.read(`t-שלום, אתה מתקשר ממספר ${call.ApiPhone}, הקש מספר כלשהו כעת ולאחריה סולמית`, "abc");
                                            yield `id_list_message=t-הקשתם ${input}.`;
                                            return call.goToFolder(hangupExtension);
                                        }
                                        
                                        var apiHandler = new YemotAPIHandler(callHandler);
                                        app.get('*', apiHandler.handle.bind(apiHandler));
                                        
                                        app.listen(port, ()=>console.log("YemotAPIHandler started!"));
                                        

                                        נ.ב. לא נראה לי שאני הולך לעבוד על זה יותר כרגע. אשמח מאוד אם מישהו יעשה מזה משהו טוב...

                                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                        dovidD MusiCodeM 2 תגובות תגובה אחרונה
                                        3
                                        • yossizY yossiz

                                          איזה מחרוזת שולחים כדי לסיים את השיחה בימות?
                                          אני מנסה לעשות סוג של hello world עם yield כדי להדגים צורת הפעולה

                                          @MusiCode האם הקוד הנ"ל עונה על דרישותיך? הפונקציה call נראה כמעט כמו הקוד שלך רק בתוספת המילה yield.

                                          WWWW מנותק
                                          WWWW מנותק
                                          WWW
                                          כתב ב נערך לאחרונה על ידי
                                          #30

                                          @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                          איזה מחרוזת שולחים כדי לסיים את השיחה בימות?

                                          @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                          @yossiz
                                          שולחים את המשתמש לשלוחת ניתוק
                                          (לא ידוע לי על דרך אחרת)

                                          אני חושב שאפשר ככה:

                                          print "go_to_folder=hangup";
                                          

                                          WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                                          תגובה 1 תגובה אחרונה
                                          2
                                          תגובה
                                          • תגובה כנושא
                                          התחברו כדי לפרסם תגובה
                                          • מהישן לחדש
                                          • מהחדש לישן
                                          • הכי הרבה הצבעות


                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום