அமைதியான தோல்விகளின் ஆபத்து
நீங்கள் வேலைகளைச் செய்து முடிக்க கருவிகளைப் பயன்படுத்துகிறீர்கள். ஆனால் ஒரு கருவி பிழைச் செய்தியைக் காட்டாமல் தவறான பதிலைத் தந்தால் என்னவாகும்? இது செயலிழந்து போகும் (crash) ஒரு கருவியை விட மிகவும் ஆபத்தானது. ஒரு செயலிழப்பு என்பது ஒரு எச்சரிக்கைச் சிக்னல் போன்றது. ஆனால் ஒரு அமைதியான தோல்வி என்பது ஒரு போலிச் செய்தி போன்றது.
எனது பிரவுசர் கருவியில் (browser tool) ஒரு பிழையைக் கண்டறிந்தேன். அது ஒரு வலைப்பக்கத்திற்குப் பதிலாக "[object Promise]" என்று பதிலளித்தது. இது போன்ற பிற சிக்கல்களைத் தேடியபோது, இதே போன்ற பிழையைக் கொண்ட மேலும் 10 கருவிகளைக் கண்டறிந்தேன். பிரச்சனை ஒரு எழுத்துப் பிழை (typo) அல்ல, அது ஒரு வடிவமைப்பு (shape) சார்ந்த சிக்கல். இந்த வடிவம் முழு codebase முழுவதும் நகலெடுக்கப்பட்டிருந்தது.
AppleScript-ன் do JavaScript என்பது synchronous ஆக இருப்பதால் இந்த பிழை ஏற்பட்டது. இது async வேலைகள் முடிவடையும் வரை காத்திருக்காமல் உடனடியாகப் பதிலளிக்கும். இதன் பொருள், நீங்கள் do JavaScript-க்கு ஒரு async function-ஐ அனுப்பினால், அது அந்த function-ன் முடிவைத் தராமல் ஒரு Promise object-ஐத் தரும்.
இதைச் சரிசெய்ய, நான் async loop-ஐ Node பக்கத்திற்கு மாற்றினேன். பக்கத்தின் நிலை (page's state) நிலைபெறும் வரை அதைத் தொடர்ந்து கண்காணித்து (poll), பின்னர் முடிவைப் படிக்க ஒரு helper function-ஐப் பயன்படுத்துகிறேன். இதன் மூலம், await என்பது Node-இல் இருக்கும், மேலும் பக்கத்திற்குச் செய்யும் அழைப்பு (call) ஒரு ஒற்றை synchronous expression ஆக இருக்கும்.
இதிலிருந்து நாம் கற்றுக்கொள்ளும் பாடம் என்னவென்றால், async loop-ஐ await செய்யக்கூடிய பக்கத்திலேயே வைத்திருக்க வேண்டும்; எல்லைகளுக்கு அப்பால் (across the boundary) await செய்வதற்குப் பதிலாக, கண்காணிக்கக்கூடிய நிலையை (observable state) மட்டும் தொடர்ந்து சரிபார்க்க வேண்டும் (poll). பாலத்தை (bridge) காத்திருக்கச் சொல்லாதீர்கள். அதற்குத் திரும்பத் திரும்ப, "நீ முடித்துவிட்டாயா?" என்று கேளுங்கள் — காத்திருக்கும் வேலையை நீங்களே செய்துகொள்ளுங்கள்.
நீங்கள் ஏஜென்ட் கருவிகளை (agent tooling) உருவாக்குகிறீர்கள் என்றால், அமைதியான தோல்விகள் குறித்து எச்சரிக்கையாக இருங்கள். "[object Promise]" என்று பதிலளிக்கும் அல்லது பழைய நிலையை (stale state) அடிப்படையாகக் கொண்டு செயல்படும் கருவிகளை உங்கள் codebase-இல் grep செய்து தேடுங்கள். ஒன்றைக் கண்டால், அதை மட்டும் சரிசெய்யாமல், அதன் மற்ற வடிவங்களையும் கண்டறிந்து, நகலெடுக்கப்பட்ட அந்தப் பொதுவான வடிவத்தைச் சரிசெய்யுங்கள்.