深淺克隆和Promise非同步編程

来源:https://www.cnblogs.com/smilestudio/archive/2020/06/02/13030378.html
-Advertisement-
Play Games

深克隆和淺克隆 淺克隆 arr.slice(0) arr.concat() let obj2 = {... obj} 深克隆 function deepClone(obj){ //判斷參數是不是一個對象 let objClone = new obj.constructor(); if(obj && ...


深克隆和淺克隆

淺克隆

arr.slice(0)
arr.concat()
let obj2 = {... obj} 

深克隆

function deepClone(obj){
    //判斷參數是不是一個對象
    let objClone = new obj.constructor();
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判斷ojb子元素是否為對象,如果是,遞歸複製
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,簡單複製
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
}    

Promise詳解

局部地獄

回調地獄:上一個回調函數中繼續做事情,而且繼續回調(在真實項目的AJAX請求中經常出現回調地獄)=>非同步請求、不方便代碼的維護

Promise的誕生就是為瞭解決非同步請求中的回調地獄問題:它是一種設計模式,ES6中提供了一個JS內置類Promise,來實現這種設計模式

 function ajax1() {
	return new Promise(resolve => {
		$.ajax({
			url: '/student',
			method: 'get',
			data: {
				class: 1
			},
			success: resolve
		});
	});
}

function ajax2(arr) {
	return new Promise(resolve => {
		$.ajax({
			url: '/score',
			method: 'get',
			data: {
				stuId: arr
			},
			success: resolve
		});
	});
}

function ajax3() {
	return new Promise(resolve => {
		$.ajax({
			url: '/jige',
			// ...
			success: resolve
		});
	});
}


 ajax1().then(result => {
	return ajax2(result.map(item => item.id));
}).then(result => {
	return ajax3();
}).then(result => {

}); 
  • PROMISE是用來管理非同步編程的,它本身不是非同步的:new
    Promise的時候會立即把executor函數執行(只不過我們一般會在executor函數中處理一個非同步操作)
  • PROMISE本身有三個狀態 =>[[PromiseStatus]]
    • pending 初始狀態
    • fulfilled 代表操作成功(resolved)
    • rejected 代表當前操作失敗

new Promise的時候先執行executor函數,在這裡開啟了一個非同步操作的任務(此時不等:把其放入到EventQuque任務隊列中),繼續執行

  • p1.then基於THEN方法,存儲起來兩個函數(此時這兩個函數還沒有執行);當executor函數中的非同步操作結束了,基於resolve/reject控制Promise狀態,從而決定執行then存儲的函數中的某一個
let p1 = new Promise((resolve, reject) => {
	setTimeout(_ => {
		let ran = Math.random();
		console.log(ran);
		if (ran < 0.5) {
			reject('NO!');
			return;
		}
		resolve('OK!');
	}, 1000);
});
  • THEN:設置成功或者失敗後處理的方法
    THEN方法結束都會返回一個新的Promise實例(THEN鏈)
p1.then(result => {
console.log(`成功:` + result);
}, reason => {
	console.log(`失敗:` + reason);
});
  • p2/p3這種每一次執行then返回的新實例的狀態,由then中存儲的方法執行的結果來決定最後的狀態(上一個THEN中某個方法執行的結果,決定下一個then中哪一個方法會被執行)
  • =>不論是成功的方法執行,還是失敗的方法執行(THEN中的兩個方法),凡是執行拋出了異常,則都會把實例的狀態改為失敗
  • =>方法中如果返回一個新的PROMISE實例,返回這個實例的結果是成功還是失敗,也決定了當前實例是成功還是失敗
  • =>剩下的情況基本上都是讓實例變為成功的狀態 (方法返回的結果是當前實例的value值:上一個then中方法返回的結果會傳遞到下一個then的方法中)
		 let p1 = new Promise((resolve, reject) => {
			resolve(100);
		});
		let p2 = p1.then(result => {
			console.log('成功:' + result);
			return result + 100;
		}, reason => {
			console.log('失敗:' + reason);
			return reason - 100;
		});
		let p3 = p2.then(result => {
			console.log('成功:' + result);
		}, reason => {
			console.log('失敗:' + reason);
		}); 
  • TEHN中也可以只寫一個或者不寫函數

    • .then(fn)
    • .then(null,fn)

遇到一個THEN,要執行成功或者失敗的方法,如果此方法並沒有在當前THEN中被定義,則順延到下一個對應的函數

  • Promise.all(arr):返回的結果是一個PROMISE實例(ALL實例),要求ARR數組中的每一項都是一個新的PROMIE實例,
  • PROMISE.ALL是等待所有數組中的實例狀態都為成功才會讓“ALL實例”狀態為成功,VALUE是一個集合,存儲著ARR中每一個實例返回的結果;凡是ARR中有一個實例狀態為失敗,“ALL實例”的狀態也是失敗
  • Promise.race(arr):和ALL不同的地方,RACE是賽跑,也就是ARR中不管哪一個先處理完,處理完的結果作為“RACE實例”的結果

async / await

  • AWAIT會等待當前PROMISE的返回結果,只有返回的狀態是RESOLVED情況,才會把返回結果賦值給RESULT

  • AWAIT不是同步編程,是非同步編程(微任務):當代碼執行到此行(先把此行),構建一個非同步的微任務(等待PROMISE返回結果,並且AWAIT下麵的代碼也都被列到任務隊列中),

async function fn() {
	console.log(1);
	let result = await p2;
	console.log(result);

	let AA = await p1;
	console.log(AA);
}
fn();
console.log(2); */
  • 如果PROMISE是失敗狀態,則AWAIT不會接收其返回結果,AWAIT下麵的代碼也不會在繼續執行(AWAIT只能處理PROMISE為成功狀態的時候)
 async function fn() {
	let reason = await p3;
	console.log(reason);
}
fn(); */

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SpotLight主要功能是在iOS9系統界面下拉會出現搜索功能界面,在這裡可以搜索關鍵信息,來展示應用內的內容,並且點擊信息打開應用跳轉具體頁面等操作。這個功能還是很有用的,面對這越來越多的應用霸占你手機,給你的應用加上這麼一個搜搜功能,還是有點與眾不同,主要是提升逼格。 1、導入頭文件 impo ...
  • javascript的三種對話框是通過調用window對象的三個方法alert(),confirm()和prompt()來獲得,可以利用這些對話框來完成js的輸入和輸出,實現與用戶能進行交互的js代碼。 第一種:alert()方法 警告框alert() alert是警告框,只有一個按鈕“確定”無返回 ...
  • JordyCorner = { /* * < summary > * 在頁面onload時調用,進行倒角處理。(使用容器的底色畫出倒角。) * 要求:1、只需調用一次 * 2、指定元素的父容器必須為純色 * 3、自動把padding設為0,把大小移到新插入元素內而保持原來的相對尺寸 ! ! * < ...
  • 1. <form>標簽 表單容器,指定method屬性和action屬性是個良好的習慣。 <form methor="POST" action="http://www.juetan.cn/user/1"> //其他屬性: name:表單名稱,便於在Javascript中引用該表單。 target:表 ...
  • 在我們開發BS頁面的時候,往往需要瞭解常規界面組件的使用,小到最普通的單文本輸入框、多文本框、下拉列表,以及按鈕、圖片展示、彈出對話框、表單處理等等,本篇隨筆基於普通表格業務的展示錄入的場景介紹這些常規Element組件的使用,使得我們對如何利用Element組件有一個大概的認識。 ...
  • Checkbox a-checkbox 沒有value屬性,綁定用checked Collapse 使用摺疊面板的時候,antd 的層級關係是 .ant-collapse >.ant-collapse-item > .ant-collapse-content > .ant-collapse-cont ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document< ...
  • 內置對象:對象是由屬性和方法組成的,使用點語法訪問 一,array數組 1. 特點: 數組用於存儲若幹數據,自動為每位數據分配下標,從0開始 數組中的元素不限數據類型,長度可以動態調整 動態操作數組元素 :根據元素下標讀取或修改數組元素,arr[index] 2. 屬性和方法: 屬性 : lengt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...