JavaScript 中只有几件事是异步的:
- 事件监听器
setTimeout
setInterval
AJAX 在内部使用事件侦听器。
所以你做一些类似的事情:
var xhr = new XMLHTTPRequest();
xhr.addEventlistener('readystatechanged', function () {
console.log(xhr.responseText);
});
如果您正在使用回调,您的代码可能如下所示:
function do_ajax(url, data, callback) {
var xhr = new XMLHTTPRequest();
xhr.open("POST", url);
xhr.addEventlistener('readystatechanged', function () {
if (xhr.readyState==4 && xhr.status==200) {
callback(xhr.responseText);
}
});
}
do_ajax("service.php", "foo=bar", function (response) {
console.log(response);
});
如果您有非常复杂的异步流程,我建议您查看Promises。这是 jQuery 对 promises 的看法。
您可以执行以下操作:
when(async_process()).then(function (result) {
return do_something_asynchronous(result); // <-- the result is a promise
}).done(function (result) { // <-- and the resolved value is the input here
console.log(result);
});
使用 Promises,您的代码可能如下所示:
headlines.getRandom(true).then(function (random_headlines) {
return new HeadLine(random_headlines);
}).done(headline) {
console.log("And presto!", headline);
});