網(wǎng)站、promise、跨域

1. 發(fā)布網(wǎng)站

1. 項目:前端后端開發(fā)的項目代碼;
2. 域名:需要在萬網(wǎng)(被阿里云收購)上購買域名;每個域名像身份證號一樣,不會重復(fù),一旦被注冊,就不能進(jìn)行再次購買;-->解析-->備案

  • DNS 解析;讓當(dāng)前域名和服務(wù)器的IP地址進(jìn)行綁定;

3. 服務(wù)器:每個服務(wù)器都會有一個對應(yīng)的IP地址;會把項目部署到服務(wù)器上;

  • 虛擬服務(wù)器;-->一般用于小型項目和小型公司的網(wǎng)站

4. ftp : 可以把項目上傳到服務(wù)器;特定的端口下;

5. 【端口號】在服務(wù)器上分布這65535個小房間;一個服務(wù)器最多承載65535個項目;端口號的范圍 0-65535;

  • 一般情況下,一個端口只配置一個項目;如果有兩個項目,就會出現(xiàn)端口的占用;一個端口只能監(jiān)聽一個項目

2. http協(xié)議

  1. http : 超文本傳輸協(xié)議;在客戶端和服務(wù)器之間不僅可以進(jìn)行文本的傳輸,還可以傳送圖片,視頻,音頻; 是瀏覽器和服務(wù)端之間的約定好的一種規(guī)范;
  2. https : 加密的傳輸協(xié)議; 更安全,在協(xié)議加了一層密碼,不容易被攻擊;像銀行,支付寶,政府等一般使用這類協(xié)議;
  3. http : 運行在客戶端和服務(wù)器之間的快遞小哥;可以把客戶端信息傳送給服務(wù)器;服務(wù)器可以整理好的數(shù)據(jù)通過http 再發(fā)送給客戶端;

3. 在瀏覽器中輸入一個url,都發(fā)生了什么?

1. http請求階段

  1. 瀏覽器首先會把url 發(fā)送給DNS服務(wù)器;解析出一個服務(wù)器的IP地址;
  2. DNS服務(wù)器會根據(jù)IP找到對應(yīng)的服務(wù)器,(服務(wù)器需要聯(lián)網(wǎng));
  3. 服務(wù)器接收到請求;客戶端和服務(wù)器已經(jīng)產(chǎn)生了鏈接;

2. http響應(yīng)階段

  1. 服務(wù)器接收到請求后,會根據(jù)你傳過來的地址,路徑等找到對應(yīng)的項目;
  2. 在服務(wù)器找到之后,服務(wù)器立即把一些響應(yīng)信息放在響應(yīng)頭,通過http發(fā)送給客戶端;同時進(jìn)行數(shù)據(jù)的整理;
  3. 把整理出來的數(shù)據(jù),通過http發(fā)送給客戶端;直到客戶端數(shù)據(jù)接收完畢

3. 瀏覽器渲染階段

  1. 瀏覽器拿到從服務(wù)器傳輸過來的文件;
  2. 首先會遍歷HTML,形成DOM樹;
  3. 代碼從上到下解析,形成css樹;
  4. DOM樹和css樹,重新組合成render樹;
  5. 瀏覽器進(jìn)行描繪和渲染;

4. 框架和jquery的區(qū)別

  1. 框架:組件化開發(fā)、虛擬DOM;操作的不是真實的DOM;
  2. jquery :操作的是真實的DOM,性能慢,比較低;

5. 三次握手;四次揮手

  1. 第一次握手: 客戶端發(fā)送SYN碼數(shù)據(jù)包發(fā)送給服務(wù)器,客戶端要求和服務(wù)器建立聯(lián)機;
  2. 第二次握手:服務(wù)端接收聯(lián)機請求,會發(fā)送ACK碼到客戶端,是要建立聯(lián)機嗎;
  3. 第三次握手:客戶端接收到服務(wù)端的ack碼,驗證是否正確,如果正確,則再次發(fā)送ack ,建立連接;

三次握手之后,客戶端和服務(wù)端聯(lián)機成功,可以發(fā)送數(shù)據(jù)
客戶端和服務(wù)端發(fā)送數(shù)據(jù)是雙向的;客戶端給服務(wù)端傳遞的是路徑,參數(shù),隨機數(shù);服務(wù)端給客戶端傳輸自己的資源,文件,數(shù)據(jù);

  1. 第一次揮手,當(dāng)客戶端發(fā)送數(shù)據(jù)結(jié)束,需要發(fā)送fin告訴服務(wù)端,數(shù)據(jù)傳輸結(jié)束;
  2. 第二次揮手,當(dāng)服務(wù)端數(shù)據(jù)接收完畢,服務(wù)端返回給客戶端一個ACK碼,;客戶端接收到ack,就會把發(fā)送到服務(wù)端的通道進(jìn)行關(guān)閉;
  3. 第三次揮手,服務(wù)端數(shù)據(jù)傳輸結(jié)束之后,也會發(fā)送fin給客戶端;
  4. 第四次揮手,當(dāng)客戶端接收數(shù)據(jù)完畢之后,會發(fā)送給Ack給服務(wù)端,服務(wù)器可以安心關(guān)閉傳輸數(shù)據(jù)的通道;

6. uri、url、urn

  1. uri=url+urn

URI : 統(tǒng)一資源標(biāo)識符
URL : 統(tǒng)一資源定位符
URN : 統(tǒng)一資源名稱

  1. 由什么組成?

http : 傳輸協(xié)議; 如果是http協(xié)議,網(wǎng)站可以進(jìn)行省略;
域名: image.baidu.com
端口號: 0--65535
路徑 : 服務(wù)器的資源的文件的路徑;
? : 問號后面跟著的是參數(shù);?tn=屬性值
? 后面常跟著一個隨機的數(shù)字; 為了防止瀏覽器的緩存,不同的隨機數(shù),會重新進(jìn)行請求

7. 接口文檔

  1. 接口文檔:前后交互的文檔: 用來標(biāo)識請求的url,參數(shù),返回的數(shù)據(jù)類型;

url:"";
type:"get" "post";
參數(shù) : username:""; password:"";

返回的數(shù)據(jù)類型: [{id:"",title:"",link:""},{},{}];
一般前端后端對項目一起進(jìn)行開發(fā),但是前端需要一些假數(shù)據(jù)來測試一下,所以就有了模擬數(shù)據(jù)和假數(shù)據(jù);

8. ajax的基礎(chǔ)

1. ajax : async javascript and xml;

xml:可擴(kuò)展的標(biāo)記語言;一般用于后臺來存儲數(shù)據(jù)的;

2. ajax的特點:只讓頁面的某個部分發(fā)生變化;
3. ajax的使用:

//ajax的使用

//1. 創(chuàng)建一個ajax實例
let xhr = new XMLHttpRequest();
//2. 打開一個路徑;請求數(shù)據(jù) xhr.open(get/post,url,false);
xhr.open("get",'aside1.json',true);//false 同步   true 異步;
//3. 監(jiān)聽: 當(dāng)前ajax實例的屬性readyState;當(dāng)readyState發(fā)生變化,觸發(fā)綁定的函數(shù);
    // 0 :  初始化一個ajax的實例,readyState默認(rèn)值是0;
    // 1 :  當(dāng)open執(zhí)行完畢之后,readyState的值是1;
    // 2 : 客戶端已經(jīng)接收到服務(wù)器返回的響應(yīng)頭;
    // 3 : 客戶端開始接收數(shù)據(jù),服務(wù)器在處理整理數(shù)據(jù);
    // 4 : 客戶端已經(jīng)成功接收到所有的數(shù)據(jù);
xhr.onreadystatechange = function () {// 當(dāng)readyState發(fā)生變化,就會觸發(fā);
        console.log(this);// 指向了ajax的實例;
        console.log(xhr.readyState);// 2    3   4;
        if(xhr.readyState===4&& /^2\d{2}/.test(xhr.status)){
            // 說明瀏覽器已經(jīng)成功獲取到數(shù)據(jù);
        }
    };
    
//4. 發(fā)送請求
xhr.send();

9. ajax的請求方式以及返回的狀態(tài)碼;

  1. ajax的請求方式;

1. get :一般用于獲取服務(wù)器數(shù)據(jù);

  • get請求傳參數(shù),需要把參數(shù)放在url問號的后面;
  • 瀏覽器對url的長度的有要求,IE 2K;谷歌8K;如果多余的,自動截?。?/li>
  • get請求安全性較低;(傳輸?shù)臄?shù)據(jù)會暴露在url的問號后面);
  • get 會有緩存;會在url 的后面拼接一個時間戳;(就是為了不走緩存);

2. post: 一般用于向服務(wù)器發(fā)送數(shù)據(jù);

  • post 請求把參數(shù)放在請求體中發(fā)送給服務(wù)器;
  • 對于數(shù)據(jù)的大小沒有限制;
  • post是比較安全;
  • post 沒有緩存;

3. put : 向服務(wù)器發(fā)送一些數(shù)據(jù);

4. delete: 向服務(wù)器刪除數(shù)據(jù)

5. head: 只請求數(shù)據(jù)的響應(yīng)頭信息;

  1. 常用的狀態(tài)碼:
  • 200 : 客戶端數(shù)據(jù)接收成功;
  • 301 : 永久重定向;
  • 302 :臨時轉(zhuǎn)移,臨時重定向
  • 304 : 讀取緩存;(瀏覽器緩存)
  • 307 : 臨時轉(zhuǎn)移’;
  • 401 : 沒有權(quán)限訪問該網(wǎng)站;
  • 404 : 路徑錯誤;
  • 500 : 服務(wù)器未知錯誤;
  • 503 : 超負(fù)荷;訪問量大;
//1. 
 let xhr = new XMLHttpRequest();
 
 xhr.open("get",'aside.json',true);
 
 xhr.onreadystatechange = function () {
        
        if (xhr.readyState === 4 && /^2\d{2}/.test(xhr.status)) {
            // 說明瀏覽器已經(jīng)成功獲取到數(shù)據(jù);
            console.log(xhr.responseText);
        }
        // xhr.status; 狀態(tài)碼;代表當(dāng)前請求的狀態(tài);
        // 當(dāng)創(chuàng)建好實例,status默認(rèn)狀態(tài)值是0;
        // 當(dāng)請求結(jié)束之后,會根據(jù)當(dāng)前的請求狀態(tài)去改變這個屬性值;
        // 常用的狀態(tài)碼
        // 200 : 客戶端數(shù)據(jù)接收成功
        // 301 : 永久重定向;
        // 302 :臨時轉(zhuǎn)移,臨時重定向
        // 304 : 讀取緩存;(瀏覽器緩存)
        // 307 : 臨時轉(zhuǎn)移
        // 401 : 沒有權(quán)限訪問該網(wǎng)站;
        // 404 : 路徑錯誤
        // 500 : 服務(wù)器未知錯誤;
        // 503 : 超負(fù)荷;訪問量大;
    }
    
    xhr.send();

10. ajax的同步異步

  1. js:單線程;每次執(zhí)行一個任務(wù);

當(dāng)主任務(wù)隊列執(zhí)行完畢,再去把等待任務(wù)隊列的任務(wù)拿到主任務(wù)隊列來執(zhí)行;(微任務(wù),宏任務(wù);)

  1. 瀏覽器:多線程;可以同時進(jìn)行多個任務(wù);
  2. 同步:瀏覽器必須把這個任務(wù)執(zhí)行完畢,才能繼續(xù)執(zhí)行下一個任務(wù);
  3. 瀏覽器讓任務(wù)沒有執(zhí)行完,但是可以繼續(xù)執(zhí)行下一行代碼;
  4. 異步的有:定時器、 ajax 、promise的then 、事件行為綁定的方法、 回調(diào)函數(shù)、async await
 let xhr = new XMLHttpRequest();
 
 xhr.open("get",'aside.json',true);//同步
    
 xhr.onreadystatechange = function () {
        console.log(xhr.readyState);//如果是異步請求,會執(zhí)行三次,如果是同步請求會執(zhí)行一次;
        if (xhr.readyState === 4 && /^2\d{2}/.test(xhr1.status)) {
            console.log(xhr.responseText);
        }
    };
    xhr1.send();

11. jQuery版ajax

$.ajax({
         url:"aside.json",
         type:"get",// 默認(rèn)是get請求
         async:true,// 默認(rèn)是異步
         data:{//向服務(wù)端發(fā)送的數(shù)據(jù)
             username:"1833333",
             password:"888888"
         },
         dataType:"json",// 默認(rèn)請求回來是json格式;
         success:function (data) {
             // 數(shù)據(jù)請求成功執(zhí)行這個回調(diào)
         },
         error:function(){
         //數(shù)據(jù)請求不成功執(zhí)行這個回調(diào)
         }
     });


    // url : 請求路徑
    // type:請求方式
    // dataType:返回的數(shù)據(jù)類型;
    // async : true: 異步(默認(rèn)就是異步);
    // data: 屬性值是一個對象;里面含有了多個鍵值對;客戶端發(fā)送給服務(wù)器的參數(shù);
    // success:當(dāng)數(shù)據(jù)請求成功之后,調(diào)用success的回調(diào)函數(shù);并且會把請求到的數(shù)據(jù)傳給這個回調(diào)函數(shù);
    // error: 當(dāng)請求失敗會執(zhí)行這個回調(diào)函數(shù);
    // cache:是否走緩存;true是走緩存,false,不走緩存;get;

1. Promise

  1. Promise:是瀏覽器新增的內(nèi)置API;為了處理異步操作;
  2. Promise:是一個同步的過程;Promise傳進(jìn)的回調(diào)函數(shù)會立即執(zhí)行;當(dāng)回調(diào)函數(shù)執(zhí)行完畢,才會執(zhí)行下面的任務(wù);
  3. Promise執(zhí)行必須接收函數(shù)作為實參;
  4. Primise的三種狀態(tài):pending fulfilled rejected;從pending到成功狀態(tài)、從pending到失敗狀態(tài);如果當(dāng)前promise狀態(tài)一旦發(fā)生改變,那當(dāng)前promise的狀態(tài)就會凝固,不會發(fā)生改變
// promise的特點
// promise 是一個內(nèi)置的類;不僅在window中存在,而且在node的global的全局對象下也存在;
// Promise 是es6新增的內(nèi)置API;在IE下是不兼容;但是上線時會把所有es6的語法轉(zhuǎn)換成es5;
/*for(var i=0;i<19;i++){
    // 閉包
    // 1.保護(hù)變量
    // 2.儲存值
}*/

// 1.promise是同步的;傳進(jìn)一個回調(diào)函數(shù);當(dāng)執(zhí)行promise時,會立即執(zhí)行這個回調(diào)函數(shù);

// 2. promise 有三個狀態(tài);
// pending  等待狀態(tài)
// fulfilled   成功態(tài)
// rejected   失敗態(tài)
// 一旦當(dāng)前狀態(tài)發(fā)生改變,當(dāng)前狀態(tài)凝固;resolve是從pending到fulfilled時觸發(fā)的;rejected是pending到rejected觸發(fā);

// 3. resolve和reject傳參的問題;

// 4.如果在Promise的回調(diào)函數(shù)中,拋出異常;會觸發(fā)rejected中的所有函數(shù);

// then  :
// 1.在promise原型的then方法中,返回是一個實例;實現(xiàn)then的鏈?zhǔn)秸{(diào)用;
// 2. 下一個then中執(zhí)行fulfilled中方法,還是rejected 的方法;需要靠上一個then中返回的promise實例的狀態(tài);
// 3. 如果then中方法返回一個promise實例,那么這個promise會控制下一個then中方法執(zhí)行;會把then默認(rèn)返回的promise覆蓋;
// 4. 如果then中沒有相應(yīng)的方法,那么會默認(rèn)進(jìn)行補全;
class  Mypromise{
    constructor(excutor){// constructor 接收到一個函數(shù)
        // this --->實例;
        // 當(dāng)resolve執(zhí)行時,會把當(dāng)前實例上的成功的池子中所有的方法執(zhí)行
        // 給實例初始化兩個空數(shù)組;
        // 初始化一個狀態(tài),pending
        this.state = "pending";
        this.fulfilledEvent = [];
        this.rejectedEvent = [];
        this.value = undefined;
        let  resolve =result=>{
            // 循環(huán)池子中方法,讓其挨個執(zhí)行;
            // 定時器解決了then方法中函數(shù)的異步回調(diào)問題;
            // 一旦當(dāng)前狀態(tài)凝固,不能再次調(diào)用resolve狀態(tài);
            if(this.state!=="pending")return;
            this.state = "fulfilled";
            this.value  = result;
            setTimeout(()=>{
                this.fulfilledEvent.forEach(item=>{
                    if(typeof item==="function"){
                        item(this.value);
                    }
                })
            },0);
        };
        // 當(dāng)reject執(zhí)行時,會把實例上失敗的池子方法執(zhí)行;
        let reject =(reason)=>{
            if(this.state!=="pending")return;
            this.state = "rejected";
            this.value = reason;
            let timer = setTimeout(()=>{
                clearTimeout(timer);
                this.rejectedEvent.forEach(item=>{
                    if(typeof item==="function"){
                        item(this.value);
                    }
                });
            },0)
        };
        // 處理promise中的異常;
        try{
            excutor(resolve,reject);
        }catch (err){
            console.log(err);
            reject(err);
        }
    }
    // then方法,把成功或失敗后的回調(diào)放進(jìn)相應(yīng)的池子中;
    then(resolveFn,rejectFn){
        // 如果then中,沒有傳遞相應(yīng)的方法,應(yīng)對其進(jìn)行補全;
        if(resolveFn==undefined){
            resolveFn = result =>{
                return result;
            }
        }
        if(rejectFn==undefined){
            rejectFn = reason =>{
               throw new Error('err');
                //為了執(zhí)行下面的reject,在這個函數(shù)中拋出一個異常
            }
        }
        return new Mypromise((resolve,reject)=>{// 、
            //不能直接把函數(shù)放進(jìn)去,因為需要判斷當(dāng)前函數(shù)是否返回一個promise的實例;
            this.fulfilledEvent.push(result=>{
                // 通過函數(shù)的返回值,是否是一個promise的實例,執(zhí)行不同的方法;如果是promise實例,應(yīng)該
                try{
                    let x = resolveFn(result);
                    x instanceof Mypromise?x.then(resolve,reject) : resolve(result);
                }catch(err){
                    reject(err);
                }
            });
            this.rejectedEvent.push(reason=>{
                // 通過函數(shù)的返回值,是否是一個promise的實例,執(zhí)行不同的方法;如果是promise實例,應(yīng)該
                try{
                    let x = rejectFn(reason);
                    x instanceof Mypromise?x.then(resolve,reject) : resolve(reason);
                    // 如果不是promise實例,執(zhí)行下一個then中resolve;
                }catch(err){
                    reject(err)
                }
            });
        })
    }
}
new  Mypromise((resolve,reject)=>{
    console.log(1);
    //throw new  Error("你你");
    reject();
}).then(function (data) {
    console.log(2);
},function (data) {
    //console.log(data);
    console.log(3);
}).then(function () {
    console.log(4);
},function(){
    console.log(5);
});
console.log(6);

let p1 = new Promise(function (reslove,reject) {
        // 當(dāng)Promise的回調(diào)函數(shù)中異步成功之后,執(zhí)行特定的函數(shù);
        // 當(dāng)前函數(shù)中,存放的是異步的操作任務(wù);當(dāng)異步的操作任務(wù)成功之后,會調(diào)用then方法中的第一個函數(shù);如果異步操作失敗,會默認(rèn)調(diào)用then的第二個函數(shù);
        // resolve: 當(dāng)異步操作成功,執(zhí)行的函數(shù);事件隊列;收集了then方法中傳進(jìn)來的第一個參數(shù);
        // reject : 當(dāng)異步操作失敗執(zhí)行的函數(shù);事件隊列;收集了then方法中傳進(jìn)來的第二個參數(shù);
        // 如果then方法中沒有返回值,或者返回的不是一個promise的實例,那么下一個then中的函數(shù)會根據(jù)第一個異步的操作成功resolve執(zhí)行有關(guān);如果then的成功的回調(diào)中,如果then的第一個函數(shù)返回一個promise的實例,那么下一個then的第一個參數(shù)會根據(jù)上一個then的返回promise中異步操作成功后,會進(jìn)行調(diào)用這個then的resolve;
        setTimeout(function () {
            reslove();
        },1000);
        console.log(1);
    });
 p1.then(function () {
        console.log("下課");
        return  new Promise(function (resolve,reject) {//重新生成一個promise實例;下面的then會根據(jù)這的promise實例來執(zhí)行;
            setTimeout(function () {
                resolve();
            },3000)
        });
    }).then(function () {
        console.log(100);//他會根據(jù)上面那個promise實例里的那個定時器來執(zhí)行(所以會延時3秒之后再執(zhí)行)
    },function () {
        console.log(200);
    });

2. Promise的應(yīng)用

1. promise:解決的是異步的回調(diào)地域;

  1. 如果有兩個請求,第二個請求需要在第一個請求成功之后,再進(jìn)行發(fā)送;
let  p = new Promise(function (resolve,reject) {
         $.ajax({
            url:"aside.json",
            dataType:"json",
            success:function () {
                resolve();
            }
         })
    });
    p.then(function () {
        $.ajax({
            url:"banner.json",
            dataType:"json",
            success:function () {

            }
        })
    });

//把代碼封裝優(yōu)化如下

function queryFn(url) {//函數(shù)每執(zhí)行一次就會創(chuàng)建一個primise實例
        return new Promise(function (resolve,reject) {
            $.ajax({
                url:url,
                dataType:"json",
                success:function () {
                    resolve();
                }
            });
        });
    }
    
    queryFn("aside.json").then(function () {//如果不寫return,這個回調(diào)函數(shù)的返回值就是undefined;只有promise的實例才能調(diào)用then
     return  queryFn("banner.json");
    }).then(function () {
        queryFn("111.json")
    });
  // then : 可以只傳一個參數(shù);那么這個參數(shù)是成功的回調(diào);

3. Promise中的catch

let p1 = new Promise(function (resolve,reject) {
        setTimeout(function () {
            if(Math.random()>0.5){
                resolve(12)
            }else{
                reject()
            }
        },1000)
    });
    // 一般情況下,then只放一個成功的回調(diào)函數(shù),會把失敗的回調(diào)函數(shù)放進(jìn)catch的回調(diào)函數(shù)
    p1.then(function (data) {
        console.log(data);
        return new Promise(function (resolve,reject) {
            reject();
        })
    }).then(function () {

    }).catch(function () {//把catch放到最后,只要有一個請求失敗,就會執(zhí)行catch;
        console.log(13);
    })

4. Promise.all和Promise.race

Promise.all

  1. Promise.all返回一個新的promise的實例;這個新的實例的狀態(tài)由數(shù)組中的promise實例來決定,當(dāng)數(shù)組中所有的promise都是成功態(tài),新的promise就是成功態(tài),如果有一個失敗,變成失敗態(tài);
  2. 數(shù)組中的promise實例,會把成功的數(shù)據(jù)組成一個數(shù)組,傳給promise.all的then的參數(shù);

Promise.race

  1. 數(shù)組中的實例誰先執(zhí)行,那么就會把誰的數(shù)據(jù)傳遞給then;
function queryFn(url) {
        return new Promise(function (resolve,reject) {
            $.ajax({
                url:url,
                dataType:"json",
                success:function (data) {
                    resolve(data);
                }
            });
        });
    }

//1. promise.all
//當(dāng)數(shù)組中的所有實例都執(zhí)行成功,then才會執(zhí)行
 Promise.all([queryFn('aside.json'),queryFn("banner.json")]).then(function (arr) {//傳參是數(shù)組形式的
    console.log(arr);
    }).catch(function (a) {
        console.log(a);
    });

//2. promise.race
//數(shù)組中的哪個實例請求的快,then輸出哪個
 Promise.race([queryFn('aside.json'),queryFn("banner.json")]).then(function (arr) {
        console.log(arr);
    }).catch(function (a) {
        console.log(a);
    });

5. 異步的微任務(wù)(async)和宏任務(wù)

  1. 主任務(wù)隊列存儲的都是同步的任務(wù);
  2. 等待任務(wù)隊列中存儲都是異步的任務(wù);當(dāng)主任務(wù)隊列中的任務(wù)執(zhí)行完成之后,接下來會把異步任務(wù)隊列到達(dá)時間的任務(wù)拿出放到主任務(wù)隊列中進(jìn)行執(zhí)行;

在異步的任務(wù)隊列中分為微任務(wù)宏任務(wù);當(dāng)同步的任務(wù)執(zhí)行完畢,先去等待的任務(wù)隊列把所有的微任務(wù)找出來,挨個執(zhí)行;當(dāng)微任務(wù)執(zhí)行完畢,再把所有的宏任務(wù)執(zhí)行;

  1. 微任務(wù): Promise的then 、 async函數(shù)、 process.nextTick
  2. 宏任務(wù):setTimeout 、 setInterval ...
  3. async
  4. .async這個函數(shù)默認(rèn)返回一個promise的實例;返回值可以調(diào)用then方法
  5. 在函數(shù)中await后面的代碼都是異步的;把后面的表達(dá)式變成一個微任務(wù);
  6. async必須成對出現(xiàn)(和await一起出現(xiàn))
function fn() {
        console.log(3);
    };
    
async function sum() {
        console.log(1);
        await fn();
        // await : 把后面的代碼變成了異步的任務(wù);
        console.log(2);
    }
    sum();
    console.log(4);
    
//輸出 1 3 4 2

6. 跨預(yù)(jsonp)

  1. 跨預(yù)存在同源策略和非同源策略

同源:協(xié)議相同、域名相同、端口號相同

  1. ajax屬于同源策略,在不做任何處理的情況下,只能訪問自己服務(wù)器下的數(shù)據(jù)
  2. 瀏覽器屬于非同源策略,可以訪問任何服務(wù)器上的數(shù)據(jù);
  3. script標(biāo)簽里的src屬性是非同源策略,發(fā)送的請求可以跨預(yù)拿到數(shù)據(jù),
  4. JSONP是常見的一種跨域解決方式,實現(xiàn)非同源下的數(shù)據(jù)請求;
<script>
 function  fn(data){console.log(data)}//這里的data就會拿到跨預(yù)請求到的數(shù)據(jù)
 </script>

<script src="http://matchweb.sports.qq.com/kbs/calendar?columnId=100000&callback=fn">//拼接一個callback屬性來接收返回的數(shù)據(jù)</script>

  1. jsonp的原理:
  1. 利用script標(biāo)簽的src屬性,src屬性是非同源策略,可以訪問不同服務(wù)器或端口下的數(shù)據(jù);
  2. 給這個src的路徑拼接一個callback的屬性,callback=fn;當(dāng)數(shù)據(jù)通過http傳輸給服務(wù)器;服務(wù)器會把數(shù)據(jù)放進(jìn)callback傳進(jìn)的函數(shù)的參數(shù)里;
  3. 服務(wù)器把處理的數(shù)據(jù)和函數(shù)通過http傳給客戶端,當(dāng)客戶端接收到之后,讓fn進(jìn)行執(zhí)行;
    fn(data);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容