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():

                     

© 小时科技 保留一切权利