DanLevy.net

בעיות נפוצות ב‑Promise

הימנעות משגיאות נפוצות

Hero image for בעיות נפוצות ב‑Promise

הבטחות אינן פועלות כמו ערכים אחרים

אתה לא יכול להדפיס את ערכן כמו ברוב הערכים:

// זה לא הגיוני עם הבטחות:
console.log(Promise.resolve(42));
// חייבים להשתמש בממשק `.then`:
Promise.resolve(42).then(value => console.log(value));

הבטחות אינן מזהירות אותך כשאתה טועה

טעות נפוצה.

מסיבות שונות, הוחלט על‑ידי TC39 שממשקי .then ו‑.catch יכולים לקבל null. לדוגמה, .then(null, null) תקף וההתנהגות הנדרשת היא לדלג על “השלב” הזה בשרשרת.

ההשלכה הלא‑נעימה של זה היא שקל מאוד לשבור דברים.

בדוגמה

בואו נבחן אתגר קטן: אילו מהאפשרויות הבאות יקריאו console.log עם 42?

// אפשרות #1:
Promise.resolve(42).then(console.log());
// אפשרות #2:
Promise.resolve(42).then(console.log);
// אפשרות #3:
Promise.resolve(42).then(value => console.log(value));
// אפשרות #4:
Promise.resolve(42)
.then(console.log())
.then(console.log);
התשובה

התשובה היא #2, #3 ו‑#4.

למה? נבדוק את הסוגים של מה שהועבר ל‑.then():

var arg1 = console.log();
var arg2 = console.log;
var arg3 = value => console.log(value);
typeof arg1 === "undefined";
typeof arg2 === "function";
typeof arg3 === "function";

עדיין תוהים איך האפשרות הרביעית עובדת?

בפועל היא מתבצעת כך:

// Option #4 - effectively
Promise.resolve(42)
.then(undefined) // זה לא משפיע על הערך, הוא יועבר ל‑`.then(fn)` הבא
.then(console.log);