Node.jsでfirebase functionsを開発していると、Promiseを使う場面が多いと思いますが、Promiseをfunctionでreturnしないと、functionの処理に非常に時間がかかったり、処理が非常に不安定になるようです。
const myPromise = new Promise((resolve, reject) => {
// なんか処理
});
// myProimise内での処理とは無関係にfunctionのレスポンスを返す。→ 不安定
exports.notReturnPromise= functions.https.onCall((data, context) => {
myPromise.then(() => {
});
return {"code": "success"};
});
// myProimise内での処理が終わったらfunctionのレスポンスを返す。→ レスポンスは遅くなるが安定
exports.returnPromise= functions.https.onCall((data, context) => {
return myPromise.then(() => {
return {"code": "success"};
});
});
筆者の環境ではPromiseをreturnしなかった場合、下記のような不具合が多発しました。
- Cloud Storageへのアップロードに時間がかかったり、SSLの認証で落ちる
- firestoreのtransaction処理でエラーが多発
- timeout
- transaction missingなどなど
functionでPromiseをreturnするようにしたところ、上記の問題は発生しなくなりました。
functionはPromiseがresolveされるまで、レスポンスを返さないので、Promiseのresolveに時間がかかる処理がある場合、funtionがレスポンスを返すのも時間がかかるようになります。Promiseのresolveを待たないでfirebase functionをreturnすることで、function自体のレスポンスを早く返すことを期待しましたが、Promise内(Promise Chain)の処理が不安定になり、使い物になりませんでした。
コメント