【发布时间】:2023-04-10 01:54:02
【问题描述】:
我是 javascript 的新手,我正在尝试了解它的异步性质。为此,这是我的示例代码:
$("#calculate-similarity").click(function(){
// assume input is an array whose length is larger than 0
var requestData={"uris":input,"limit":100};
client=new Ajax(requestData);
alert('inside .click function');
})
Ajax=function(requestData){
alert('inside ajax');
$.ajax({
url: 'http://localhost:8080/',
type:'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify(requestData),
xhrFields: {
withCredentials: true
}
}).done(function(data) {
$("#ws-results").children().detach();
$("#ws-results").append('<table id="my-final-table"><thead><th>fname</th><th>furi</th><th>sname</th><th>suri</th><th>similarity</th></thead><tbody></tbody></table>');
$('#my-final-table').dynatable({
dataset: {
records:data
}
});
});
}
现在,在上面,我正在创建 new Ajax() 并在其中创建一个 ajax 请求。据我所知它的异步事件。因此,我认为,这个请求应该首先完成,然后我的其他 javascript 行 (alert('inside .click function')) 应该被执行。换句话说,我希望:
1) alert inside ajax
2) show my datatable on the browser
3) alert inside .click function
但是,我得到了以下命令:
1) alert inside ajax
2) alert inside .click function
3) show table on the browser
那么,你建议我如何理解这些概念?我对 c++ 和 java 等多种编程语言有扎实的背景,但这是我第一次接触 web 开发和 javascript。
编辑
如果我像下面这样修改我的 .click 函数,你是说首先总是会打印 10000 次 hello 然后显示表格吗?或者表格会显示在记录中间的某个地方?我的意思是当响应到来时,引擎应该先等待才能显示它?
修改后的代码:(让我们删除所有的警报语句)
$("#calculate-similarity").click(function(){
// assume input is an array whose length is larger than 0
var requestData={"uris":input,"limit":100};
client=new Ajax(requestData);
for(var z=0;z<10000;z++){
console.log(z+'hi!');
}
})
【问题讨论】:
-
异步意味着它将乱序完成。按照您建议的顺序期望它是同步的。如果您有 C++/Java 方面的背景,我想一个简单的类比(虽然实际上并不正确)是认为 Ajax 在单独的线程上运行。代码立即返回,不等待结果。
-
@dman2306 实际上你是对的。我有点困惑。您知道我可以用来理解这些概念的任何好的资源吗?
-
如果你熟悉 Java 中的 Swing,想想当你创建一个窗格对象(任何窗格都可以)时,它会立即在内存中发生,但是当你想对其调用 paint 时,它会被推送到 Swing 线程并安排在稍后执行。与您的 Ajax 对象和本机 ajax 请求对象类似的概念(不涉及线程)。
标签: javascript jquery ajax asynchronous