JavaScript 异步编程笔记

                     

贡献者: addis

预备知识 JavaScript 入门笔记

   由于 JS 主要是单线程操作,所以像文件读写、上传下载等操作都必须异步完成。

1. 异步处理

function loadXMLDoc(url) {
    let xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            // Here you can handle the XML data
            let xmlDoc = this.responseXML;
            console.log(xmlDoc);
        }
    };

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

loadXMLDoc(myURL);
// 其他命令
当此时浏览器会单独开一个线程用于下载 url 中的文件,但在下载完以前 loadXMLDoc(myURL); 语句就会结束然后开始 其他命令。只有 其他命令 全部都执行完了,才会开始 event loop,如果下载已经完成,就会把这个事件放到执行队列里面。其他命令 执行完了下载还没完成,就会一直做 event loop 检查事件,如果发生了别的事件(例如用户按下按钮)就会先去处理该事件,这样就不会出现等到下载完页面才有反应的尴尬现象。

   所以可能一些从来没见过异步编程的程序员很不习惯的地方就在于 其他命令 中是不可能获取到下载的任何数据的。下载的数据只能在回调函数 xmlhttp.onreadystatechange 中处理!

   这就是事件导向的编程思路!

2. Promise

console.log("Before Promise");

let myPromise = new Promise((resolve, reject) => {
    console.log("Inside Promise executor");
    resolve("Operation successful");
});

myPromise.then(
    (value) => { console.log(value); },  // Executed asynchronously
    (error) => { console.log(error); }
);

console.log("After Promise");
输出:
Before Promise
Inside Promise executor
After Promise
Operation successful

let myPromise = new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Completed!');
        }, milliseconds);
    });

连续的 .then():


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利