ホームページ > データベース > mysql チュートリアル > Node.js で Express と Promise を使用すると Promise が途中で解決されるのはなぜですか?

Node.js で Express と Promise を使用すると Promise が途中で解決されるのはなぜですか?

DDD
リリース: 2024-11-17 15:32:02
オリジナル
925 人が閲覧しました

Why Does My Promise Resolve Prematurely in Node.js with Express and Promises?

Node.js Express と Promises: 予測できない動作への対処

Unwait Promise の原因

コード内で、findUser 関数用に作成された Promise が実行されますただし、関数自体は非同期です。したがって、promise は findUser がデータを取得できる前に解決されてしまいます。

適切な Promise 実行の実装

値を同期的に返すのではなく、Promise を返すように findUser 関数を変更します。以下に例を示します。

me.findUser = function(params, res) {
    var username = params.username;

    return new Promise(function (resolve, reject) {

      pool.getConnection(function (err, connection) {
        if (err) {
          reject(err);
          return;
        }

        connection.query('select Id, Name, Password from Users ' +
            'where Users.Name = ?', [username], function (err, rows) {
            connection.release();
            if (err) {
                reject(err);
            } else {
                resolve(rows);
            }
        });
      });
    });
}
ログイン後にコピー

エラー処理

findUser でエラーが発生したときに 2 番目の Promise のエラー ハンドラーが拒否されるため、「エラー ハンドラー 2 番目」メッセージが表示されます。これを修正するには、コードを次のように変更します。

promise.then(function(data) {
            return new Promise(function (resolve, reject) {
                loginC.doSomething(data);

                if (success) {
                    console.log("Success 2");
                    resolve(data);
                } else {
                    console.log("Failed 2");
                    reject("Error in doSomething");
                }
            });
        }).catch(function (reason) {
            console.log("Error in findUser: " + reason);
        });
ログイン後にコピー

追加メモ

  • 接続コールバックでデータベース接続エラーを処理するようにしてください。
  • 依存しないでください。非同期操作の同期メソッドについて。
  • Promise は非同期のチェーンに使用されます。操作と結果を確実に処理します。

以上がNode.js で Express と Promise を使用すると Promise が途中で解決されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート