仍有问题。当我调用此函数时,它似乎返回两次???我得到了'test2'在控制台中,然后进行“测试”。我还将回调返回值放入控制台,然后将其设置为false。 getwidget仅从this.nextwidget调用一次,这是一个按钮。
getwidget = function (callback) {
var id = get_name_value('salesperson');
var password = 'password';
if (id !== "") {
$.get('http://somewhere.com?id=' + id + '&password=' + password,
function (data, status) {
console.log(status);
if (status === 'success') {
catalogue = $.parseJSON(data);
if (catalogue.status === "error") {
alert(catalogue.message);
} else {
console.log('test');
if (callback) callback(true);
}
} else {
alert("Error connecting to API:" + status);
}
});
}
console.log('test2');
if (callback) callback(false);
};
this.nextwidget = function() {
catindex = catindex + 1;
getwidget(function(trigger) {
if (!trigger && catindex > 0) {
catindex = catindex - 1;
}
if (catindex === catlen - 1) {
document.getElementById("nextwidget").disabled = true;
}
if (catindex !== 0) {
document.getElementById("prevwidget").disabled = false;
}
console.log(catindex);
console.log(trigger);
});
};
答案 0 :(得分:2)
Javascript是异步的。 $。get 操作是异步的,因为它是对服务器的调用。
这意味着JS不会等到此操作结束,只是继续激活下一个代码块。 因此,根据您的代码,它显示了' test2'在控制台中,使用 false 参数执行回调。只有当收到服务器的响应时,才会显示" test"在控制台中并使用 true 参数运行回调。 (当然,如果请求成功,根据您的代码段)
这是一个简单的jsfiddle,可以更好地理解它是如何工作的。 Simple async example
function asyncExample() {
setTimeout(function() {
console.log('test');
}, 1000);
console.log('test2')
}
asyncExample();
由于超时中的操作被延迟(如异步),JS不会等待并继续下一行。结果将是: ' TEST2'首先然后测试'。