𝗧𝗵𝗲 𝗗𝗮𝗻𝗴𝗲𝗿 𝗼𝗳 𝗦𝗶𝗹𝗲𝗻𝘁 𝗙𝗮𝗶𝗹𝘂𝗿𝗲𝘀 Вы используете инструменты для выполнения работы. Но что, если инструмент выдает неверный ответ без ошибки? Это гораздо опаснее, чем сбой инструмента. Сбой — это указатель. Молчаливый отказ — это подделка.

Я обнаружил баг в своем инструменте для браузера. Вместо веб-страницы он возвращал "[object Promise]". Я поискал похожие проблемы и нашел еще 10 инструментов с тем же багом. Проблема была не в опечатке, а в структуре. Эта структура была скопирована по всей кодовой базе.

Баг возник из-за того, что метод do JavaScript в AppleScript является синхронным. Он возвращает результат немедленно, не дожидаясь завершения асинхронной работы. Это означает, что если передать асинхронную функцию в do JavaScript, он вернет объект Promise, а не результат выполнения функции.

Чтобы исправить это, я перенес асинхронный цикл на сторону Node. Я использую вспомогательную функцию для опроса состояния страницы до тех пор, пока оно не стабилизируется, а затем считываю результат. Таким образом, await находится на стороне Node, а вызов страницы представляет собой единое синхронное выражение.

Урок заключается в том, чтобы держать асинхронный цикл на той стороне, которая может использовать await, и опрашивать наблюдаемое состояние через границу, вместо того чтобы пытаться использовать await через неё. Не просите «мост» подождать. Спрашивайте его снова и снова: «ты уже закончил?» — и ждите сами.

Если вы создаете инструментарий для агентов, опасайтесь молчаливых отказов. Проверьте свою кодовую базу с помощью grep на наличие инструментов, которые возвращают "[object Promise]" или работают с устаревшим состоянием. Если найдете такой, не просто исправьте его. Найдите подобные инструменты и исправьте ту самую структуру, которая была скопирована.

Источник: https://dev.to/achiya-automation/my-browser-tool-returned-object-promise-as-a-webpage-one-grep-later-10-more-tools-had-the-37p8