Gelung panggilan alat (tool-calling loops) Claude mempunyai reputasi dalam menghasilkan kod promise yang berselirat dalam Node.js.
Promise.withResolvers() baharu dalam Node.js 22 membolehkan pembangun menggantikan corak new Promise yang sarat dengan kod boilerplate dengan satu baris kod yang memberikan promise serta fungsi resolve/reject miliknya. Hasilnya ialah kurangnya panggilan resolve yang terlupa, tiada amaran double-reject, dan aliran kawalan yang lebih rata (flatter control flow) yang lebih mudah diuji dan dikekalkan dalam persekitaran serverless.

Mengapa corak lama merosakkan aliran

Apabila LLM seperti Claude meminta alat (tool), implementasi Node yang tipikal kelihatan seperti ini:

return new Promise((resolve, reject) => {
  // launch the tool, attach callbacks, maybe fire another async call
});

Tiga perangkap berulang timbul:

  • Resolve yang terlupa – Jika laluan kod tidak pernah memanggil resolve, Lambda atau pengendali serverless lain akan tergantung sehingga tamat masa (timeout), sekali gus meningkatkan kos.
  • Double reject – Laluan ralat yang memanggil reject sebanyak dua kali akan mencetuskan amaran “unhandled rejection” yang boleh menyebabkan proses terhenti (crash) dalam mod ketat (strict mode).
  • Nesting yang mendalam – Setiap langkah async menyisipkan callback lain di dalam pembina (constructor), menyebarkan logik dan menjadikan ujian