𝗧𝗵𝗲 𝗗𝗮𝗻𝗴𝗲𝗿 𝗼𝗳 𝗦𝗶𝗹𝗲𝗻𝘁 𝗙𝗮𝗶𝗹𝘂𝗿𝗲𝘀 ജോലികൾ പൂർത്തിയാക്കാൻ നിങ്ങൾ ടൂളുകൾ ഉപയോഗിക്കുന്നു. എന്നാൽ ഒരു ടൂൾ ഒരു എറർ (error) കാണിക്കാതെ തന്നെ തെറ്റായ ഉത്തരം നൽകിയാലോ? ഒരു ടൂൾ ക്രാഷ് (crash) ആകുന്നതിനേക്കാൾ അപകടകരമാണ് ഇത്. ഒരു ക്രാഷ് എന്നത് ഒരു സൂചനയാണ്. എന്നാൽ ഒരു നിശബ്ദ പരാജയം (silent failure) എന്നത് ഒരു വ്യാജമാണ്.

എന്റെ ബ്രൗസർ ടൂളിൽ ഞാൻ ഒരു ബഗ് (bug) കണ്ടെത്തി. അത് ഒരു വെബ്പേജിന് പകരം "[object Promise]" എന്നാണ് നൽകിയത്. സമാനമായ പ്രശ്നങ്ങൾക്കായി ഞാൻ തിരഞ്ഞപ്പോൾ ഇതേ ബഗ് ഉള്ള മറ്റ് 10 ടൂളുകൾ കൂടി കണ്ടെത്തി. പ്രശ്നം ഒരു ടൈപ്പോ (typo) ആയിരുന്നില്ല, മറിച്ച് അതിന്റെ ഘടന (shape) ആയിരുന്നു. ഈ ഘടന കോഡ്ബേസിലുടനീളം പകർത്തിയിരിക്കുകയായിരുന്നു.

AppleScript-ലെ do JavaScript സിൻക്രണസ് (synchronous) ആയതുകൊണ്ടാണ് ഈ ബഗ് ഉണ്ടായത്. അസിങ്ക് (async) ജോലികൾ പൂർത്തിയാകുന്നത് വരെ കാത്തുനിൽക്കാതെ ഇത് ഉടനടി റിസൾട്ട് നൽകുന്നു. ഇതിനർത്ഥം, നിങ്ങൾ do JavaScript-ലേക്ക് ഒരു അസിങ്ക് ഫംഗ്ഷൻ നൽകിയാൽ, അത് ഫംഗ്ഷന്റെ ഫലത്തിന് പകരം ഒരു Promise ഒബ്‌ജക്റ്റ് ആയിരിക്കും നൽകുക എന്നാണ്.

ഇത് പരിഹരിക്കുന്നതിനായി, ഞാൻ അസിങ്ക് ലൂപ്പിനെ (async loop) Node സൈഡിലേക്ക് മാറ്റി. പേജിന്റെ അവസ്ഥ (state) മാറുന്നത് വരെ അത് പരിശോധിക്കാനും (poll) തുടർന്ന് റിസൾട്ട് വായിക്കാനും ഞാൻ ഒരു ഹെൽപ്പർ ഫംഗ്ഷൻ ഉപയോഗിക്കുന്നു. ഇത്തരത്തിൽ, await എന്നത് Node-ൽ ആയിരിക്കും, പേജിലേക്കുള്ള കോൾ ഒരു സിംഗിൾ സിൻക്രണസ് എക്സ്പ്രഷൻ (synchronous expression) ആയിരിക്കും.

ഇതിൽ നിന്നുള്ള പാഠം ഇതാണ്: അസിങ്ക് ലൂപ്പിനെ await ചെയ്യാൻ കഴിയുന്ന ഭാഗത്ത് തന്നെ നിലനിർത്തുക, അതിന് കുറുകെ await ചെയ്യുന്നതിന് പകരം അതിർത്തിക്ക് അപ്പുറത്തുള്ള മാറ്റങ്ങൾ (observable state) പരിശോധിക്കുക (poll). പാലത്തോട് കാത്തുനിൽക്കാൻ ആവശ്യപ്പെടരുത്. പകരം, "നീ പൂർത്തിയായോ?" എന്ന് ആവർത്തിച്ച് ചോദിക്കുക — കാത്തിരിപ്പ് നിങ്ങൾ തന്നെ ചെയ്യുക.

നിങ്ങൾ ഏജന്റ് ടൂളിംഗ് (agent tooling) നിർമ്മിക്കുകയാണെങ്കിൽ, നിശബ്ദമായ പരാജയങ്ങളെക്കുറിച്ച് ജാഗ്രത പാലിക്കുക. "[object Promise]" എന്ന് റിസൾട്ട് നൽകുന്നതോ അല്ലെങ്കിൽ പഴയ സ്റ്റേറ്റിൽ (stale state) പ്രവർത്തിക്കുന്നതോ ആയ ടൂളുകൾക്കായി നിങ്ങളുടെ കോഡ്ബേസ് ഗ്രെപ്പ് (grep) ചെയ്യുക. ഒന്ന് കണ്ടെത്തിയാൽ അത് മാത്രം ശരിയാക്കിയാൽ പോരാ. അതിന്റെ സമാനമായ മറ്റ് ഭാഗങ്ങളും കണ്ടെത്തി ആ കോഡ് ഘടനയും ശരിയാക്കുക.

Source: https://dev.to/achiya-automation/my-browser-tool-returned-object-promise-as-a-webpage-one-grep-later-10-more-tools-had-the-37p8