2

私のindex.jsには、送信ボタンを押すとajax経由でクライアントにデータを送り返すことになっているエクスポート機能があります。ただし、ユーザーが送信を押すと、データが変更される前にデータが送信されたように見えます。送信をもう一度押すと、送信ボタンをクリックしても「以前に」設定されたデータのみが送信されるかのように、以前に変更されたデータが送信されます。これは私のコードです:

        var tabledata = getRecordFromDatabase(key);
        if(tabledata.length === 0)
            tabledata = 'There is no matched record in the database';
        res.contentType('text/html');
        res.send({'matched':tabledata});

エラーを説明すると、フォームに入力した後に送信をクリックすると、「データベースに一致するレコードがありません」というメッセージが返されます。入力したばかりのフォームを何も変更せずに、もう一度送信を押しました。今回は実際にタイムレコードデータが送られてきました。これはなぜですか?

4

1 に答える 1

4

何をしていてgetRecordFromDatabaseも非同期でノンブロッキングであれば、node.js は正常に動作しています。Node.js はノンブロッキングです。プロセスが完了するのを停止したり待機したりしません (これらのプロセスが意図的にブロックするように記述されていない限り、これは通常 node.js で回避されます)。これは、サーバーが新しいリクエストを受け入れ、一度に多くのリクエストを処理できるようにするため、有益です。

データベース呼び出しが非同期の場合、res.send(). そのため、最初の送信は空に戻ります。ほとんどの場合、2 回目の送信を実行するまでに、DB 呼び出しが最終的に返されるため、結果が得られます。

DB 呼び出しメソッドで何が起こっているかを抽象化したため、問題に対するコードベースの回答を提供するのは困難です。ただし、通常、非同期呼び出しは次のようになります。

getRecordFromDatabase(key, function(err, data){
    if(data.length === 0)
        data = 'There is no matched record in the database';
    res.contentType('text/html');
    res.send({'matched':data});
});

このようにして、実行する関数をコールバックとして非同期メソッドに渡します。非同期呼び出しが完了すると、コールバックが実行res.send()され、適切なデータで が実行されます。

于 2012-07-24T15:57:32.307 に答える