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

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

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

איך יוצאים מפונקציית האב, מתוך פונקציית הבן

מתוזמן נעוץ נעול הועבר תכנות
13 פוסטים 4 כותבים 891 צפיות 3 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • MusiCodeM
    MusiCodeM
    MusiCode
    כתב ב נערך לאחרונה על ידי
    #1

    נתון הקוד הבא:

    const { EventEmitter } = require("events");
    
    const express = require("express");
    
    const app = express();
    
    const event = new EventEmitter();
    
    const calls = {};
    
    app.get("/", async (req, res, next) => {
    
        if (calls[req.query.id]) {
            calls[req.query.id].res = res;
            event.emit(req.query.id);
        } else {
            calls[req.query.id] = { res };
    
            const long_data = {"...": "..."};
    
            console.log("start!");
            calls[req.query.id].res.end("start!");
    
            await new Promise((resolve, reason) => {
    
                event.once(req.query.id, () => {
    
                    resolve();
                    // פה צריך לעצור <---
                });
            });
    
            console.log("end!");
            calls[req.query.id].res.end("end!");
        }
    
    });
    
    app.listen(3000, () => {
        console.log("runing!");
    })
    

    בקריאה הראשונה, הפונקציה נתקעת (ע"י הפרומיס).
    בקריאה השנייה, היא ממשיכה לרוץ.

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

    איך אני יכול לעצור את הקוד, מהנקודה המסומנת בחץ, בתנאים שאני אשים?

    yossizY י 2 תגובות תגובה אחרונה
    0
    • MusiCodeM MusiCode

      נתון הקוד הבא:

      const { EventEmitter } = require("events");
      
      const express = require("express");
      
      const app = express();
      
      const event = new EventEmitter();
      
      const calls = {};
      
      app.get("/", async (req, res, next) => {
      
          if (calls[req.query.id]) {
              calls[req.query.id].res = res;
              event.emit(req.query.id);
          } else {
              calls[req.query.id] = { res };
      
              const long_data = {"...": "..."};
      
              console.log("start!");
              calls[req.query.id].res.end("start!");
      
              await new Promise((resolve, reason) => {
      
                  event.once(req.query.id, () => {
      
                      resolve();
                      // פה צריך לעצור <---
                  });
              });
      
              console.log("end!");
              calls[req.query.id].res.end("end!");
          }
      
      });
      
      app.listen(3000, () => {
          console.log("runing!");
      })
      

      בקריאה הראשונה, הפונקציה נתקעת (ע"י הפרומיס).
      בקריאה השנייה, היא ממשיכה לרוץ.

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

      איך אני יכול לעצור את הקוד, מהנקודה המסומנת בחץ, בתנאים שאני אשים?

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

      @MusiCode

      try {
        await new Promise((resolve, /* reason */ reject) => {
          event.once(req.query.id, () => {
              resolve();
              // פה צריך לעצור <--- ❌ 
              // לא פה כי הקוד הזה נקרא רק בבקשה שנייה שלא תגיע
          });
          if /* or when... */ ('תנאי שאתה תציב') {
            reject('סיבה');
          }
        });
        console.log("end!");
        calls[req.query.id].res.end("end!");
      } catch {
        // אם יש מה לטפל תטפל
      }
      

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
      👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

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

        נתון הקוד הבא:

        const { EventEmitter } = require("events");
        
        const express = require("express");
        
        const app = express();
        
        const event = new EventEmitter();
        
        const calls = {};
        
        app.get("/", async (req, res, next) => {
        
            if (calls[req.query.id]) {
                calls[req.query.id].res = res;
                event.emit(req.query.id);
            } else {
                calls[req.query.id] = { res };
        
                const long_data = {"...": "..."};
        
                console.log("start!");
                calls[req.query.id].res.end("start!");
        
                await new Promise((resolve, reason) => {
        
                    event.once(req.query.id, () => {
        
                        resolve();
                        // פה צריך לעצור <---
                    });
                });
        
                console.log("end!");
                calls[req.query.id].res.end("end!");
            }
        
        });
        
        app.listen(3000, () => {
            console.log("runing!");
        })
        

        בקריאה הראשונה, הפונקציה נתקעת (ע"י הפרומיס).
        בקריאה השנייה, היא ממשיכה לרוץ.

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

        איך אני יכול לעצור את הקוד, מהנקודה המסומנת בחץ, בתנאים שאני אשים?

        י
        י
        יוסף בן שמעון
        כתב ב נערך לאחרונה על ידי יוסף בן שמעון
        #3

        אולי זה יעזור https://www.npmjs.com/package/cache

        תגובה 1 תגובה אחרונה
        0
        • MusiCodeM
          MusiCodeM
          MusiCode
          כתב ב נערך לאחרונה על ידי
          #4

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

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

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

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

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

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

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

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

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

            י
            י
            יוסף בן שמעון
            כתב ב נערך לאחרונה על ידי
            #5

            @MusiCode כתבת הנחות שרק מי שמונח בסיטואציה שלך יכול להבין אותם
            אולי תפרט מי נגד מי

            MusiCodeM תגובה 1 תגובה אחרונה
            2
            • י יוסף בן שמעון

              @MusiCode כתבת הנחות שרק מי שמונח בסיטואציה שלך יכול להבין אותם
              אולי תפרט מי נגד מי

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

              @יוסף-בן-שמעון אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

              @MusiCode כתבת הנחות שרק מי שמונח בסיטואציה שלך יכול להבין אותם
              אולי תפרט מי נגד מי

              אוקיי.

              הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.

              האם יש דרך לעצור אותה בתוך הקריאה לפונקציה block, כך שלא יודפס למסך ולדפדפן end.

              אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.

              תודה רבה למנסים לעזור!

              const { EventEmitter } = require("events");
              
              const express = require("express");
              
              const app = express();
              
              const event = new EventEmitter();
              
              const calls = {};
              
              app.get("/", async (req, res, next) => {
              
                  if (calls[req.query.id]) {
                      calls[req.query.id].res = res;
              
                      event.emit(req.query.id);
                  } else {
                      calls[req.query.id] = { res };
              
                      calls[req.query.id].block = async function block() {
              
                          await new Promise((resolve, reason) => {
              
                              event.once(req.query.id, () => {
                      
                                  resolve();
                                  // פה צריך לעצור
                              });
                          });
                      }
              
                      fn(calls[req.query.id]);
                  }
              
              });
              
              async function fn(call) {
              
                  const long_data = { "...": "..." };
              
                  console.log("start!");
                  call.res.end("start!");
              
                  await call.block();
              
                  console.log("end!");
                  call.res.end("end!");
              }
              
              app.listen(3000, () => {
                  console.log("runing!");
              });
              

              אולי אני אנסח שאלה אחרת:
              יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?

              yossizY י 2 תגובות תגובה אחרונה
              0
              • MusiCodeM MusiCode

                @יוסף-בן-שמעון אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

                @MusiCode כתבת הנחות שרק מי שמונח בסיטואציה שלך יכול להבין אותם
                אולי תפרט מי נגד מי

                אוקיי.

                הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.

                האם יש דרך לעצור אותה בתוך הקריאה לפונקציה block, כך שלא יודפס למסך ולדפדפן end.

                אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.

                תודה רבה למנסים לעזור!

                const { EventEmitter } = require("events");
                
                const express = require("express");
                
                const app = express();
                
                const event = new EventEmitter();
                
                const calls = {};
                
                app.get("/", async (req, res, next) => {
                
                    if (calls[req.query.id]) {
                        calls[req.query.id].res = res;
                
                        event.emit(req.query.id);
                    } else {
                        calls[req.query.id] = { res };
                
                        calls[req.query.id].block = async function block() {
                
                            await new Promise((resolve, reason) => {
                
                                event.once(req.query.id, () => {
                        
                                    resolve();
                                    // פה צריך לעצור
                                });
                            });
                        }
                
                        fn(calls[req.query.id]);
                    }
                
                });
                
                async function fn(call) {
                
                    const long_data = { "...": "..." };
                
                    console.log("start!");
                    call.res.end("start!");
                
                    await call.block();
                
                    console.log("end!");
                    call.res.end("end!");
                }
                
                app.listen(3000, () => {
                    console.log("runing!");
                });
                

                אולי אני אנסח שאלה אחרת:
                יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?

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

                @MusiCode אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

                הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.

                אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.

                יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?

                לא נראה לי שיש דרך לעשות בדיוק מה שאתה מבקש. אבל לדעתי אתה לא אמור לעשות את זה.
                אתה מצהיר למשתמש שהפונקציה block יכולה לזרוק שגיאת timeout או איזה שגיאה שאתה מחליט, והמשתמש אמור לטפל בזה בדרך שהוא מחליט.

                או כלך לדרך זו,
                אתה מצהיר שהפונקציה תחזיר ערך במקרה של הצלחה ו-null או undefined במקרה של כשלון, והמשתמש יבדוק את הערך שאתה מחזיר.

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
                👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

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

                  @יוסף-בן-שמעון אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

                  @MusiCode כתבת הנחות שרק מי שמונח בסיטואציה שלך יכול להבין אותם
                  אולי תפרט מי נגד מי

                  אוקיי.

                  הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.

                  האם יש דרך לעצור אותה בתוך הקריאה לפונקציה block, כך שלא יודפס למסך ולדפדפן end.

                  אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.

                  תודה רבה למנסים לעזור!

                  const { EventEmitter } = require("events");
                  
                  const express = require("express");
                  
                  const app = express();
                  
                  const event = new EventEmitter();
                  
                  const calls = {};
                  
                  app.get("/", async (req, res, next) => {
                  
                      if (calls[req.query.id]) {
                          calls[req.query.id].res = res;
                  
                          event.emit(req.query.id);
                      } else {
                          calls[req.query.id] = { res };
                  
                          calls[req.query.id].block = async function block() {
                  
                              await new Promise((resolve, reason) => {
                  
                                  event.once(req.query.id, () => {
                          
                                      resolve();
                                      // פה צריך לעצור
                                  });
                              });
                          }
                  
                          fn(calls[req.query.id]);
                      }
                  
                  });
                  
                  async function fn(call) {
                  
                      const long_data = { "...": "..." };
                  
                      console.log("start!");
                      call.res.end("start!");
                  
                      await call.block();
                  
                      console.log("end!");
                      call.res.end("end!");
                  }
                  
                  app.listen(3000, () => {
                      console.log("runing!");
                  });
                  

                  אולי אני אנסח שאלה אחרת:
                  יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?

                  י
                  י
                  יוסף בן שמעון
                  כתב ב נערך לאחרונה על ידי
                  #8

                  @MusiCode אתה מנוע מלפרט על הסיטואציה?

                  by6199B תגובה 1 תגובה אחרונה
                  1
                  • י יוסף בן שמעון

                    @MusiCode אתה מנוע מלפרט על הסיטואציה?

                    by6199B
                    by6199B
                    by6199
                    כתב ב נערך לאחרונה על ידי
                    #9

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

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

                      @MusiCode אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

                      הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.

                      אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.

                      יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?

                      לא נראה לי שיש דרך לעשות בדיוק מה שאתה מבקש. אבל לדעתי אתה לא אמור לעשות את זה.
                      אתה מצהיר למשתמש שהפונקציה block יכולה לזרוק שגיאת timeout או איזה שגיאה שאתה מחליט, והמשתמש אמור לטפל בזה בדרך שהוא מחליט.

                      או כלך לדרך זו,
                      אתה מצהיר שהפונקציה תחזיר ערך במקרה של הצלחה ו-null או undefined במקרה של כשלון, והמשתמש יבדוק את הערך שאתה מחזיר.

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

                      @yossiz אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

                      @MusiCode אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:

                      הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.

                      אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.

                      יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?

                      לא נראה לי שיש דרך לעשות בדיוק מה שאתה מבקש. אבל לדעתי אתה לא אמור לעשות את זה.
                      אתה מצהיר למשתמש שהפונקציה block יכולה לזרוק שגיאת timeout או איזה שגיאה שאתה מחליט, והמשתמש אמור לטפל בזה בדרך שהוא מחליט.

                      או כלך לדרך זו,
                      אתה מצהיר שהפונקציה תחזיר ערך במקרה של הצלחה ו-null או undefined במקרה של כשלון, והמשתמש יבדוק את הערך שאתה מחזיר.

                      @yossiz תודה.
                      זה מה שאעשה.

                      תגובה 1 תגובה אחרונה
                      1
                      • MusiCodeM
                        MusiCodeM
                        MusiCode
                        כתב ב נערך לאחרונה על ידי
                        #11

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

                        למה אם השגיאה בפונקציה א-סנכרונית זה שונה?

                        אני עושה סתם

                        try {
                                //...
                            } catch (error) {
                                throw error;
                            }
                        

                        הלינטר מתעצבן על כזה דבר מיותר!
                        הרי אני זורק, בדיוק את אותה השגיאה שקיבלתי!

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

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

                          למה אם השגיאה בפונקציה א-סנכרונית זה שונה?

                          אני עושה סתם

                          try {
                                  //...
                              } catch (error) {
                                  throw error;
                              }
                          

                          הלינטר מתעצבן על כזה דבר מיותר!
                          הרי אני זורק, בדיוק את אותה השגיאה שקיבלתי!

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

                          @MusiCode אני לא מבין את השאלה שלך.

                          למה אני לא יכול לזרוק שגיאה סתם?

                          מה זה "שגיאה סתם"?

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

                          מי היה מציג מה?

                          הלינטר מתעצבן על כזה דבר מיותר!

                          הרי אני זורק, בדיוק את אותה השגיאה שקיבלתי!

                          אתה שואל כאן או מסביר?

                          קיצור לא הבנתי אותך, אולי החסרון בי

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה
                          👈 רוצים כתובת מייל בעברית? כנסו למייל.קום 👉

                          תגובה 1 תגובה אחרונה
                          1
                          • MusiCodeM
                            MusiCodeM
                            MusiCode
                            כתב ב נערך לאחרונה על ידי
                            #13

                            טוב, לא יודע למה יצאתי כזה לא ברור.

                            על קטע קוד כזה

                            async function fn() {
                                throw ("error!")
                            }
                            
                            fn();
                            

                            נוד לא מוכן לשתוק.

                            הוא מביא את השגיאה הבאה:

                            (node:17268) UnhandledPromiseRejectionWarning: error!

                            (node:17268) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)`

                            תגובה 1 תגובה אחרונה
                            0

                            שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

                            נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

                            בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

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


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

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

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