前回の質問から派生したものですが
https://teratail.com/questions/271176
timeout(中断)機能が用意されていないパッケージの関数があり、promise.raceを使ってtimeoutを実現しています。
しかし、パッケージ内のpromiseはresolveされるまでずっと実行されたままです。
これをexpress.jsのhttp requestで実行した場合、クライアント側にはタイムアウトとして返す事が出来ますが、
もしパッケージ関数でずっとresolveが実行されなかった場合、node.js側はどのような事が起きますか?
メモリーりーくを防ぐならどのような方法が考えられますか?
const xxxPackage = require('xxx'); const myFunc() => { // xxxPackageにはtimeout機能が用意されていない // promice.raceを使って実現しているが、xxxPackage.promiseFunc()はずっと実行され続ける return Promise.race([xxxPackage.promiseFunc(), timeout(10000)]) } const timeout = (timeMs) => new Promise((resolve,reject) => { setTimeout(() => { reject(new Error("timeout")); }, timeMs); }); // --- express.jsのルーティング部分 ---- router.get('/', async(req, res, next) => { try { const result = await myFunc(); res.send({result}); } catch (e) { // timeoutになった場合、ここに来る res.status(500).send('Internal server error:' + e); } });
require('xxx') が OSSのモジュールなら明記してください。
秘匿しなければならない「案件」に関するものであれば、回答は得られないと思います。
返信が遅くなってしまいました。
ここでrequire('xxx')のモジュール名を載せるのは難しいので、回答は諦めようと思います。
timeoutに対応したverがあったので、そちらを使う事で解決しました。
reject/resolveを実行しないpromiseを作って検証もしたのですが、そもそもそんなモジュールを使うのがイレギュラーすぎるので、無理に深堀するのは止めようと思います。
興味本位で時間があれば、検証してみようとは思います。
返答ありがとうございました
回答1件
あなたの回答
tips
プレビュー