2017-12-03 113 views
0

我有函数bellow每5秒调用一次从服务器获取数据,这是flask/python。我的问题是,如何调整getjson调用以在成功检索数据时进行回调。getJSON done回调

我知道那里有.done .fail等等,但我想知道如果我可以保留这个结构,只是添加下面的结构,但我不知道在这种情况下的语法,希望这不是太感到困惑,感谢阅读,这是代码。

// get data from the server every getDataFromServerInterval milliseconds 
var getDataFromServerInterval = 5000; 
function getData(){ 
    // request timesince table entries from server for user... 
    $.getJSON($SCRIPT_ROOT + '/_database', { 
    action: "getUserTable_timesince", 
    username: $('input[name="username"]').val() 
    }, function(data) { // do something with the response data 
    timesince_dataBuffer = data; 
    }); 
    return false; // prevent get 
} 
// get data from the server every getDataFromServerInterval milliseconds 
setInterval(getData, getDataFromServerInterval); 
+0

你想用getData中的回调做什么? – Jasjeev

+0

_“保持这种结构,只是添加波纹管它”_:这是不明确的。你什么意思?你能编辑你的问题来举个例子吗? – Andy

回答

0

我发现的部分解决方案,我发现我可以在一个处理所接收的数据的功能,这是有点相当于在不同的getJSON呼叫结构.done的末尾添加一个回调,我还不确定在接收数据之前还是之后调用该函数。

// global timesince buffer, holds 
var timesince_dataBuffer; 

// get data from the server every getDataFromServerInterval milliseconds 
var getDataFromServerInterval = 5000; 
function getData(){ 
    // request timesince table entries from server for user 
    $.getJSON($SCRIPT_ROOT + '/_database', { 
    action: "getUserTable_timesince", 
    username: $('input[name="username"]').val() 
    }, function(data) { // do something with the response data 
    timesince_dataBuffer = data; 
    updateEntryStruct(); // the hope is to call this when data is received 
    }); 
    return false; // prevent get 
} 
// get data from the server every getDataFromServerInterval milliseconds 
setInterval(getData, getDataFromServerInterval); 
0

你可以这样做。不要处理getData中的数据或使用回调,请利用$.getJSON返回的承诺。有一个单独的函数,由调用数据的超时调用,then处理它。它整齐地将你的代码分离成更多可管理的功能。

var getDataFromServerInterval = 5000; 

function getData() { 
    return $.getJSON($SCRIPT_ROOT + '/_database', { 
    action: "getUserTable_timesince", 
    username: $('input[name="username"]').val() 
    } 
} 

function wrangleData() { 
    getData().then(function (data) { 
    console.log(data); 
    }); 
} 

setInterval(wrangleData, getDataFromServerInterval); 
+0

谢谢,不知道这个语法。我想出了这个: var timesince_dataBuffer; ($ SCRIPT_ROOT +'/ _database',{ action:“getUserTable_timesince”, username:$('input [name =“username”]')。val() },function(data){ timesince_dataBuffer = data; updateEntryStruct(); }); 返回false; } 这个调用是更新内容,按钮等的结构。 里面的文本是按时间间隔更新的,因为我使用的是时间对象。这样我就不会重新创建按钮,只有文本。 –

+0

对不起,缩进,我不知道如何缩进回复。 –

0

这是我想出的解决方案。

var timesince_dataBuffer; 
function getData(){ 
    // gets user's entries from sql table 
    $.getJSON($SCRIPT_ROOT + '/_database', { // $SCRIPT_ROOT, root to the application 
    action: "getUserTable_timesince", 
    username: $('input[name="username"]').val() 
    }, function(data) { // if a response is sent, this function is called 
    timesince_dataBuffer = data; 
    updateEntryStruct(); // recreate the structure of each content, buttons etc 
    }); 
    return false; 
} 

我得到的数据,放在一个全局变量,调用另一个函数,该函数接收到的每个对象的数据并重新创建一个结构,这样一来我不重建它是静态的结构件,最重要的是纽扣。

另一个函数每1秒调用一次,它更新动态部分。 (格式化的时间),因为 (事件名称)传送

无论如何,这实际上是我在CS50最后一个项目,我开始通过表单提交的服务器进行通信,每个用户按下一个按钮时刷新页面,则我是用ajax做的,但是我每2秒向服务器发送一次请求,并且没有响应按钮,因为我会在一定的时间间隔内自己重新创建按钮。 现在,网页感觉反应迅速,效率很高,这是一次很棒的学习体验。

如果有人想查看代码,一切都在这里。 https://github.com/silvermirai/cs50-final-project

它基本上是一堆随机功能,想到了。 该应用程序可以在这里找到截至目前。 http://ide502-silvermirai.cs50.io:8080/