-
טוב.
זה מורכב יותר, כי הפונקציה החיצונית, האב, לא בשליטתי, אלא בשליטת משתמש.אני רוצה לעצור אותה, מבפנים, ששם זה כן בשליטתי...
לכן אני לא יכול לעשות טריי בפונקציית האב.
כי היא לא בידיים שלי.ואם אני עושה קאץ' בפנים, בלי טריי בחוץ, בגלל ה-סינכרוני הוא מתרגז ומאיים שבגרסה הבאה, הוא סוגר את התהליך כולו.
-
@יוסף-בן-שמעון אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:
@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!"); });
אולי אני אנסח שאלה אחרת:
יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה? -
@MusiCode אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:
הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.
אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.
יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?
לא נראה לי שיש דרך לעשות בדיוק מה שאתה מבקש. אבל לדעתי אתה לא אמור לעשות את זה.
אתה מצהיר למשתמש שהפונקציהblock
יכולה לזרוק שגיאתtimeout
או איזה שגיאה שאתה מחליט, והמשתמש אמור לטפל בזה בדרך שהוא מחליט.או כלך לדרך זו,
אתה מצהיר שהפונקציה תחזיר ערך במקרה של הצלחה ו-null או undefined במקרה של כשלון, והמשתמש יבדוק את הערך שאתה מחזיר. -
@יוסף-בן-שמעון אני מיד הבנתי מה מדובר ונראה לי שכל מי שקצת מכיר את התחום יצליח לנחש, מובן לי למה לא לפרט..
-
@yossiz אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:
@MusiCode אמר באיך יוצאים מפונקציית האב, מתוך פונקציית הבן:
הפונקציה fn, לא בשליטתי, אלא בשליטת המשתמש.
אם אני זורק שגיאה, אני חייב לתפוס אותה עם טריי, בתוך הפונקציה fn, ואת זה אני לא רוצה.
יש דרך לזרוק שגיאה במקום המסומן, ללא שנוד יתעצבן, על שגיאה שלא טופלה?
לא נראה לי שיש דרך לעשות בדיוק מה שאתה מבקש. אבל לדעתי אתה לא אמור לעשות את זה.
אתה מצהיר למשתמש שהפונקציהblock
יכולה לזרוק שגיאתtimeout
או איזה שגיאה שאתה מחליט, והמשתמש אמור לטפל בזה בדרך שהוא מחליט.או כלך לדרך זו,
אתה מצהיר שהפונקציה תחזיר ערך במקרה של הצלחה ו-null או undefined במקרה של כשלון, והמשתמש יבדוק את הערך שאתה מחזיר.@yossiz תודה.
זה מה שאעשה. -
רק סתם שאלה:
למה אני לא יכול לזרוק שגיאה סתם?
הרי אם לא היה את העניין של הא-סנכרוני, הייתי יכול לזרוק שגיאה בפונקציה הפנימית, והוא היה מציג אותה, בלי בעיות.למה אם השגיאה בפונקציה א-סנכרונית זה שונה?
אני עושה סתם
try { //... } catch (error) { throw error; }
הלינטר מתעצבן על כזה דבר מיותר!
הרי אני זורק, בדיוק את אותה השגיאה שקיבלתי! -
@MusiCode אני לא מבין את השאלה שלך.
למה אני לא יכול לזרוק שגיאה סתם?
מה זה "שגיאה סתם"?
הרי אם לא היה את העניין של הא-סנכרוני, הייתי יכול לזרוק שגיאה בפונקציה הפנימית, והוא היה מציג אותה, בלי בעיות.
מי היה מציג מה?
הלינטר מתעצבן על כזה דבר מיותר!
הרי אני זורק, בדיוק את אותה השגיאה שקיבלתי!
אתה שואל כאן או מסביר?
קיצור לא הבנתי אותך, אולי החסרון בי
-
טוב, לא יודע למה יצאתי כזה לא ברור.
על קטע קוד כזה
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)` -