0

私のコードで何が起こるかわかりません..ルート内のMySQL dbを照会し、結果をユーザーに表示するNode.jsがあります。私の問題は、ユーザーを要求したページにリダイレクトする前に、クエリを実行してクエリが完了するまでブロックする方法です。呼び出しの前にアラートを追加すると、関数は正常に実行され、応答が速くなります..しかし、アラートを無効にすると、関数は値を返すことができず、フリーズなどの関数..

nodejsに値をリクエストするためのこのユーザーコード

function fred(){ //request function from here to fblue
    alert('fred called'); //if i disable alert,the function not return any value
    get('id', function(datmovMar) {
        var obj = JSON.parse(datmovMar);
        var items = Object.keys(obj);
        var output='';
        items.forEach(function(item) {
            output+=obj[item].something+'<br/>';
          alert(output);
        });         
    });
}

function get(id, callback) {
    $.ajax('http://localhost:8000/' + id + '/', {
        type: 'GET',
        dataType: 'json',
        success: function(data) { if ( callback ) callback(data); },
        error  : function()     { if ( callback ) callback(null); }
    });
}

そして、このコードはノードjsにあります

fblue(function(datmovMar){  //call function from here
        res.write(JSON.stringify(datmovMar)); 
        res.end('\n');
});     

function fblue(callback){ 
    var query = connection.query('SELECT something from table'),
        pinMarker = []; 
    query
    .on('error', function(err) {
        console.log( err );
        updateSockets( err );
    })
    .on('result', function( user ) {
        pinMarker.push( user );
    })
    .on('end',function(){
        if(connectionsArray.length) {
            jsonStringx = JSON.stringify( pinMarker );
            callback(jsonStringx);
        }
    }); 
}

アラートが機能を無効にすると、正常に実行できない理由がわかりませんか?

助けてください...

ありがとう

4

2 に答える 2

1

$.ajaxサーバーへの非同期JavaScriptリクエストを作成するjQueryのメソッドを呼び出しています。

これは、サーバーへの呼び出しを開始した直後に制御フローが続行されることを意味します。

そのため、リクエストが処理されるまで関数からブロックされることを期待しないでfred()ください。代わりに、ブラウザ側の JavaScript コードを非同期的に書き直す必要があります。

于 2013-05-14T14:17:16.327 に答える
0

jQuery の $.ajax 関数は、デフォルトでは非同期で実行されます。つまり、実行中にリクエストがブロックされないため、後続のコード行がすぐに実行されます。非同期呼び出しでは、実行順序は保証されません。

ここで少し「チート」して、次のように async オプションを指定できます。

$.ajax('http://localhost:8000/' + id + '/', {
    type: 'GET',
    dataType: 'json',
    async: false,
    success: function(data) { if ( callback ) callback(data); },
    error  : function()     { if ( callback ) callback(null); }
});

これにより、完了するまで $.ajax 呼び出しが返されなくなります。ただし、これは実際には JavaScript のやり方ではありません。非同期実行によって得られる効率が失われるからです。別の KARASZI が指摘したように、これは非同期で記述する必要があります。

于 2013-05-16T18:56:21.190 に答える