0

我不知道我的代码会发生什么......我有一个 Node.js,它在路由中查询 MySQL 数据库并将结果显示给用户。我的问题是如何在将用户重定向到他们请求的页面之前运行查询并阻止查询完成?如果我在调用之前添加警报,功能运行正常并快速响应..但是如果警报禁用该功能无法返回任何值,则该功能如冻结..

此用户代码向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

您正在调用 jQuery 的$.ajax方法,该方法将为您的服务器创建一个异步 javascript 请求。

这意味着控制流将在您启动对服务器的调用后立即继续。

因此,在您的请求得到服务之前,您不应该期望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 回答