שאלות בסיסיות ב-js או בכלל בתכנות
-
שאלה נוספת
server.on("request", function (request, response) {})
response זו התשובה שנשלחת
איך היא נשלחת ללא return ??ספק אם הבנתיך. הקוד שאתה מציג זה הרשמה להאזנה לאיוונט, לפי הנהוג במימוש קלאסי של תבנית Observer pattern (ראה בויקי עברית).
כשהserver מקבל reqest הוא עובד בלולאה על הפונקציות שנשלחו לו (ע"י פונקציות הon) ומפעיל אותם תוך השמת הפרמטרים הנדרשים.פורסם במקור בפורום CODE613 ב01/09/2015 10:44 (+03:00)
-
@דוד ל.ט.
עכשיו, אם אין אזכור למשתמש err ה-ide הוא צועק: expected error to be handled.
ממתי זה מעניין אותו?ובכלל, כל העברת ארגמנט ב-js זה handled ??
כתב חידה קשה מאוד. לא מבין אפי' מילה.
יש פונקצית קולבק כזו
function (err, value) { if (err) return console.log('Ooops!', err) // likely the key was not found console.log(value) }
עכשיו אם אני מוחק את השורה הזו
if (err) return console.log('Ooops!', err)
ה-ide צועק שגיאה expected error to be handled, ככל שאני מבין הכוונה שאני לא מממש את הארגומנט err שמועבר לפונקציה.
למה זה מעניין אותו? הוא הרי אפילו לא מצפה שאכניס בארגומנט הזה ערך או משהו.
נכון יותר: אני מרגיש שזה לא ארגומנט רגיל, או שלפונקצית קולבק יש התנהגויות מיוחדות או כל דבר אחר שאני מפספס.אפשרות נוספת, הכל רגיל, רק שבפונקציה שמריצה את פונקצית הקול-בק יש התניה מפורשת שחייב להיות בדיקת ה-error.
באמת עשיתי מאמץ להתבטא ברור.. מקווה שהצלחת
תודה רבה!פורסם במקור בפורום CODE613 ב03/09/2015 22:39 (+03:00)
-
@דוד ל.ט.
@אהרן
שאלה נוספתserver.on("request", function (request, response) {})
response זו התשובה שנשלחת
איך היא נשלחת ללא return ??ספק אם הבנתיך. הקוד שאתה מציג זה הרשמה להאזנה לאיוונט, לפי הנהוג במימוש קלאסי של תבנית Observer pattern (ראה בויקי עברית).
כשהserver מקבל reqest הוא עובד בלולאה על הפונקציות שנשלחו לו (ע"י פונקציות הon) ומפעיל אותם תוך השמת הפרמטרים הנדרשים.תודה רבה!
למדתי לא מעט מושגים חדשים.
אני רק לא בטוח האם זה מסביר איך עובד פונקצית האזנה, או גם (או רק..) את פונקצית הקול בק.אני התכוונתי לשאול על פונקצית הקול-בק שמקבל שני ארגומנטים req res אחד מיועד להכניס לפונקציה ואחד לקבל מהפונקציה.
איך השמת ערכים בארגומנט (שהוא כמובן אוביקט) המקבל משפיע מחוץ לפונקציה? הוא מכיל בתוכו פונקצית notify (ואם זו האפשרות הנכונה, איך הפונקציה מבחינה בשינוי?) ? או שיש הגדרה שאותו משתנה חוזר ולא העתק ממנו (שבפסקל נדמה לי שמצמידים @לשם המשתנה) ?שוב תודה על הזמן היקר והכוחות שאתם משקיעים עבור אחרים!
פורסם במקור בפורום CODE613 ב03/09/2015 22:52 (+03:00)
-
כהשלמה לשאלות הקודמות
ראיתי קוד כזה בערך (כותב מהזכרון)on.(data, console) { on.(console, console.log('bla')) {
console זה ארוע ?? הרי הוא אוביקט שמחזיק שלל פונקציות!
עוד משהו דומה
זה המימוש הסטנדרטי:http = require("http"); //The require var MyServer = http.createServer(function(request, response) {
והוא שווה ל:
var server = http.createServer(); server.on("request", function (request, response) {
request הוא ארוע בגלל שכל העברת ארגומנט, או סוגים מסוימים מפעילים ארועים שאפשר להאזין להם, או שפשוט כותבי המודול כתבו במפורש שכש-request נשלח מופעל ארוע באותו שם ??
פורסם במקור בפורום CODE613 ב03/09/2015 23:34 (+03:00)
-
יש פונקצית קולבק כזו
function (err, value) { if (err) return console.log('Ooops!', err) // likely the key was not found console.log(value) }
עכשיו אם אני מוחק את השורה הזו
if (err) return console.log('Ooops!', err)
ה-ide צועק שגיאה expected error to be handled, ככל שאני מבין הכוונה שאני לא מממש את הארגומנט err שמועבר לפונקציה.
למה זה מעניין אותו? הוא הרי אפילו לא מצפה שאכניס בארגומנט הזה ערך או משהו.
נכון יותר: אני מרגיש שזה לא ארגומנט רגיל, או שלפונקצית קולבק יש התנהגויות מיוחדות או כל דבר אחר שאני מפספס.אפשרות נוספת, הכל רגיל, רק שבפונקציה שמריצה את פונקצית הקול-בק יש התניה מפורשת שחייב להיות בדיקת ה-error.
באמת עשיתי מאמץ להתבטא ברור.. מקווה שהצלחת
תודה רבה!כעת אתה ברור לגמרי.
ואני מאוד מופתע מהתנהגות זו. אני מסכים אם השאלה, זה לא אמור לעניין את הIDE והוא גם לא אמור ל"הרגיש" את הקשר הפונקציה (אם היא callback והאם הפרמטר הראשון שלה קשור למושג exeption).
אשמח תשפרט את הרקע, מי צועק ואיפה בדיוק.פורסם במקור בפורום CODE613 ב04/09/2015 10:43 (+03:00)
-
function myModule() { ... } var myModule = new myModule(); //creating the instanceמה זה עושה ??
מה עושה שמכניסים את אותו משתנה לתוכו?
כשכותבים new לפני קריאה לפונקציה, אז:
- במידה והפונקציה מחזירה אובייקט (לא פרימיטיבי כטקסט ומספר כלומר כזה שהלוג שלו מיוצג עם סוגריים {}), אז הוא מוחזר למשתנה.
- במידה ואיננה מחזירה אובייקט (או שאיננה מחזירה כלום או טיפוס פרימיטיבי) אז נוצר אובייקט חדש שמהווה "קרקע" (בתכנותית: מופע, instance) לthis שבפונקציה. בלי ה"קרקע" הזו הפונקציה הנקראת "דורכת" על "קרקע" הפונקציה הקוראת.
הדגמה:
function func() { this.a = "variable "; return "function result..."; } var resultWithoutNew = func(); console.log(resultWithoutNew); //function result... console.log(a); // variable console.log(resultWithoutNew.a); // undefined a = 123; var resultWithNew = new func(); console.log(resultWithNew); // { a: 'variable ' } console.log(a); // 123 console.log(resultWithNew.a); // variable
הnew מאפשר לתת "סקופ" חדש למה שהפונקציה מחזירה וככה ליצור מופעים שונים של אותו מחלקה-אב טיפוס על מאפייניו והפונקציות שלו.
פורסם במקור בפורום CODE613 ב04/09/2015 12:35 (+03:00)
-
@דוד ל.ט.
תלונתו היא שאתה ניגש לvalur בלי לבדוק קודם שהerror ריק (אם תוסיף if (!err) אזי הוא ישתוק כנראה), אבל נשגב מבינתי איך ה"חוזה" הזה מוכר לIDE.
עכשיו מצאתי איך הפונקציה עובדת
באמת עם try (מושג חדש שלא הכרתי עד שהכרת לי)LevelUP.prototype.get = function (key_, options, callback) { var self = this , key callback = getCallback(options, callback) if (maybeError(this, options, callback)) return if (key_ === null || key_ === undefined || 'function' !== typeof callback) return readError(this , 'get() requires key and callback arguments', callback) options = util.getOptions(options) key = this._codec.encodeKey(key_, options) options.asBuffer = this._codec.valueAsBuffer(options) this.db.get(key, options, function (err, value) { if (err) { if ((/notfound/i).test(err) || err.notFound) { err = new NotFoundError( 'Key not found in database [' + key_ + ']', err) } else { err = new ReadError(err) } return dispatchError(self, err, callback) } if (callback) { try { value = self._codec.decodeValue(value, options) } catch (e) { return callback(new EncodingError(e)) } callback(null, value) } }) }
פורסם במקור בפורום CODE613 ב06/09/2015 21:32 (+03:00)
-
@דוד ל.ט.
function myModule() { ... } var myModule = new myModule(); //creating the instanceמה זה עושה ??
מה עושה שמכניסים את אותו משתנה לתוכו?
כשכותבים new לפני קריאה לפונקציה, אז:
- במידה והפונקציה מחזירה אובייקט (לא פרימיטיבי כטקסט ומספר כלומר כזה שהלוג שלו מיוצג עם סוגריים {}), אז הוא מוחזר למשתנה.
- במידה ואיננה מחזירה אובייקט (או שאיננה מחזירה כלום או טיפוס פרימיטיבי) אז נוצר אובייקט חדש שמהווה "קרקע" (בתכנותית: מופע, instance) לthis שבפונקציה. בלי ה"קרקע" הזו הפונקציה הנקראת "דורכת" על "קרקע" הפונקציה הקוראת.
הדגמה:
function func() { this.a = "variable "; return "function result..."; } var resultWithoutNew = func(); console.log(resultWithoutNew); //function result... console.log(a); // variable console.log(resultWithoutNew.a); // undefined a = 123; var resultWithNew = new func(); console.log(resultWithNew); // { a: 'variable ' } console.log(a); // 123 console.log(resultWithNew.a); // variable
הnew מאפשר לתת "סקופ" חדש למה שהפונקציה מחזירה וככה ליצור מופעים שונים של אותו מחלקה-אב טיפוס על מאפייניו והפונקציות שלו.
לא מבין [כמעט] כלום
this.a = "variable ";
שווה ל
func.a = "variable ";
?
איך
console.log(a); // variable a = 123;
ממתי יש משתנה a?
הרי a הוא רק תכונה (property) של func והעתקים ממנו?!
var resultWithoutNew = func();
אם כן אני צודק שיש 3 'רמות' של העברה בין פונקציה לפונקציה
resultWithNew = func(); resultWithNew = new func(); resultWithNew = func;
- מעביר רק את התוצאה.
- רק את התכונות (במידה ומדובר באוביקט).
- את כל הפונקציה במלואה.
?
אם משתמשים באפשרות 3, ואז שעכשיו מכיל בתוכו
this.a = "variable ";
מי שם ה-this ?
סליחה על ההתקפה ותודה על הסבלנות
פורסם במקור בפורום CODE613 ב18/09/2015 16:48 (+03:00)