[解決済み] node.jsの非同期関数エクスポートの修正
質問
以下のコードでカスタムモジュールを作成しました。
module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}
モジュールの外側で関数を呼び出すとうまくいくのですが、内側で呼び出すと実行中にエラーが発生します。
(node:24372) UnhandledPromiseRejectionWarning: 未処理の約束 拒否されました (拒否 ID: 1)。ReferenceError: PrintNearestStoreは 定義
という構文に変更したところ。
module.exports.PrintNearestStore = PrintNearestStore;
var PrintNearestStore = async function(session, lat, lon) {
}
モジュール内では正常に動作し始めましたが、モジュール外ではエラーが出て失敗しました。
(node:32422) UnhandledPromiseRejectionWarning。処理されない約束 拒否されました (拒否 ID: 1)。TypeError: mymodule.PrintNearestStore is 関数ではない
ということで、コードを変更しました。
module.exports.PrintNearestStore = async function(session, lat, lon) {
await PrintNearestStore(session, lat, lon);
}
var PrintNearestStore = async function(session, lat, lon) {
...
}
これで、内側と外側のすべてのケースで動作するようになりました。しかし、セマンティクスを理解し、より美しく、より短い書き方があるのでしょうか?を正しく定義して使うにはどうしたらいいでしょうか? 非同期 関数は、モジュールの内側と外側(exports)の両方にあるのですか?
どのように解決するのですか?
これは、特に非同期関数とは関係ないんです。内部で関数を呼び出したい場合 と をエクスポートするには、それを定義します。 まず を作成し、それをエクスポートします。
async function doStuff() {
// ...
}
// doStuff is defined inside the module so we can call it wherever we want
// Export it to make it available outside
module.exports.doStuff = doStuff;
試行錯誤の問題点の説明。
module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}
これは、モジュールに関数を定義しているわけではありません。関数定義は、関数 式 . 関数式の名前は、関数自体の内部で変数を作成するだけです。もっと簡単な例
var foo = function bar() {
console.log(typeof bar); // 'function' - works
};
foo();
console.log(typeof foo); // 'function' - works
console.log(typeof bar); // 'undefined' - there is no such variable `bar`
こちらもご覧ください
名前付き関数式の謎解き
. を参照するのであれば、もちろんその関数を参照することができます。
module.exports.PrintNearestStore
をいたるところで見ることができます。
module.exports.PrintNearestStore = PrintNearestStore;
var PrintNearestStore = async function(session, lat, lon) {
}
これは
ほとんど
OKです。問題は、その値が
PrintNearestStore
は
undefined
に代入すると
module.exports.PrintNearestStore
. 実行の順番は
var PrintNearestStore; // `undefined` by default
// still `undefined`, hence `module.exports.PrintNearestStore` is `undefined`
module.exports.PrintNearestStore = PrintNearestStore;
PrintNearestStore = async function(session, lat, lon) {}
// now has a function as value, but it's too late
よりシンプルな例です。
var foo = bar;
console.log(foo, bar); // logs `undefined`, `undefined` because `bar` is `undefined`
var bar = 21;
console.log(foo, bar); // logs `undefined`, `21`
順番を変えれば期待通りに動くはずです。
module.exports.PrintNearestStore = async function(session, lat, lon) {
await PrintNearestStore(session, lat, lon);
}
var PrintNearestStore = async function(session, lat, lon) {
...
}
これは、以下の理由で動作します。
それまでに
に割り当てられた関数は
module.exports.PrintNearestStore
が実行されます。
,
PrintNearestStore
は、この関数を値として持っています。
もっと簡単な例です。
var foo = function() {
console.log(bar);
};
foo(); // logs `undefined`
var bar = 21;
foo(); // logs `21`
関連
-
[解決済み】Javascript - ERR_CONTENT_LENGTH_MISMATCH
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsで環境変数を読み込む
-
[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み] テスト
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】ES6マップオブジェクトをソートすることは可能ですか?
-
[解決済み】SyntaxError: 期待された式が、'<'を得た。
-
[解決済み】Vueが定義されていない
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]