JavaScript進階之Ajax的問題和什麼是promise

2020-12-26 兔哥學前端

前端接口調用的幾種方式 ,有原生ajax ,基於jQuery的ajax ,fetch ,axios ,原生ajax的原理和基本使用我們已經介紹過了 ,下面來看看基於jQuery的ajax的運用以及Ajax的問題

基於jQuery的Ajax

jQuery為我們提供了更強大的更進一步的原生Ajax封裝

它的用法:通過jQuery.ajax([settings])( $.ajax({}) )來配置方式發起Ajax請求

jQuery為我們提供Ajax方法

url :接口地址 ,後臺給我們提供的接口地址

函數:如果接口調用成功會有成功的回調success函數裡面可寫成功調取到接口後的業務邏輯 ,以及請求發生錯誤時的error函數 ,以及其他函數beforeSend(在發送請求之前調用)、dataFilter(在請求成功之後調用)、complete(當請求完成之後調用這個函數,無論成功或失敗)

其他常用可選參數:

type:請求方式 ("POST" 或 "GET")

注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可以使用,但僅部分瀏覽器支持。

async:默認值: true。默認設置下,所有請求均為異步請求。如果需要發送同步請求,請將此選項設置為 false。

注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執行。

data :發送到伺服器的數據。將自動轉換為請求字符串格式。也就是我們給後臺傳遞的參數等

dataType:設置伺服器返回的參數類型 ,一般都是「json」

常用參數配置(其他參數可查文檔)

Ajax的問題

Ajax異步操作是通過純粹的回調函數的形式進行處理,難以讀懂,維護困難,稍有不慎就會踏入回調地獄 - 嵌套層次深,不好維護

如果層層回調地獄裡面寫滿邏輯

promise

ES6 原生提供了 Promise 對象 ,所謂 Promise,就是一個對象,用來傳遞異步操作的消息。可以將異步操作隊列化,按照期望的順序執行,返回符合預期的結果,可以在對象之間傳遞和操作promise,幫助我們處理隊列

有了 Promise 對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。

promise 還提供了簡潔的API 使得異步操作更加容易 ,下面來構建promise 操作

1.我們使用new來構建一個Promise Promise的構造函數接收一個參數,是函數,並且傳入兩個參數: resolve,reject, 分別表示異步操作執行成功後的回調函數和異步操作執行失敗後的回調函數

new來構建一個Promise

resolve作用是,將Promise對象的狀態從「未完成」變為「成功」(即從 pending 變為 resolved),在異步操作成功時調用,並將異步操作的結果,作為參數傳遞出去;(pending[待定]初始狀態)

reject作用是,將Promise對象的狀態從「未完成」變為「失敗」(即從 pending 變為 rejected),在異步操作失敗時調用,並將異步操作報出的錯誤,作為參數傳遞出去。

2.Promise實例生成以後,可以用then方法指定resolved狀態和reject狀態的回調函數 在then方法中,你也可以直接return數據而不是Promise對象,在後面就可以接收到數據了

then方法

基於Promise發送Ajax請求

1.基於Promise封裝原生Ajax

Promise簡單封裝原生Ajax

2.通過在then方法中,直接return數據解決回調地獄

解決回調地獄代碼更清晰易維護

Promise常用API

.then():得到異步任務正確的結果

.catch() :獲取異常信息

.finally():成功與否都會執行

Promise常用實例方法

Promise.all(): 所有的完成 (方法接受一個數組作參數,數組中的對象(p1、p2、p3)均為promise實例(如果不是一個promise,該項會被用Promise.resolve轉換為一個promise)。它的狀態由這三個promise實例決定)

Promise.race():競速,完成一個即可(同樣接受一個數組作參數。當p1, p2, p3中有一個實例的狀態發生改變(變為fulfilled或rejected),p的狀態就跟著改變。並把第一個改變狀態的promise的返回值,傳給p的回調函數 )

Promise對象方法
Promise.all拿到p1 p2 p3數據

相關焦點

  • JavaScript進階之原生AJAX接口請求的方式
    簡單介紹接口調用的方式原生ajax 指的是 XMLHttpRequest(XHR)基於jQuery的ajax是 jQuery對原生ajax的進一步封裝 fetch則是通過而是es6 JavaScript Promisess
  • 原生Ajax和jquery的ajax有什麼區別?
    主要內容ajax是什麼ajax作用原生ajax請求jquery的ajax請求jquery裡面封裝的ajax方法學習目標第一節 Ajax與http術語ajax最早產生於2005年,Ajax表示Asynchronous JavaScript and XML(異步JavaScript和XML
  • jQuery的$.get()、$.post()和$.ajax()以GET/POST方式請求數據
    ,還可以使用$.ajax()方法對伺服器進行異步和同步請求數據。$.ajax()功能最為強大,一般情況下,獲取數據的GET請求和提交數據的POST請求,都可以使用$.ajax()方法來實現。二、dataType參數在$.ajax()方法中,使用dataType參數可以設置希望伺服器給我們返回什麼類型的數據,是數字呀,還是字符串呢?也可以理解為是我們想要的數據類型,數據類型以字符串的形式設置。
  • ES6 Promise實戰練習題
    console.log('promise1', promise1)console.log('promise2', promise2)setTimeout(() => { console.log('promise1', promise1) console.log('promise2', promise2)}, 2000)運行結果:promise1 Promise
  • Ajax詳解
    什麼是局部刷新?通過一個直觀的例子來了解。需求1.點擊提交按鈕,向伺服器發請求,等待響應。2.同時在input框輸入信息。3.伺服器返回"haha"字符串,將結果顯示在頁面。        傳統方法會刷新整個頁面:點擊提交按鈕後,正在input框輸入內容時,伺服器響應返回。
  • 兩個原創的Ajax+JS+Struts2經典例子
    Ajax+JS+Struts2是當前業內流行的JAVA前後臺交互機制,和Spring的MVC並稱為兩大主流框架~~主要用於前臺界面異步調用後臺Java代碼,用以實現前後臺代碼解耦。Struts2的核心原理和機制如下圖所示:
  • 使用jQuery的ajax技術+JSON數據格式+C#+SQL Server實現數據顯示
    這裡使用jQuery的ajax技術+JSON格式的數據+SQL Server資料庫來實現數據以表格形式顯示的功能。表示使用ajax技術正確在客戶端從伺服器上拿到數據了。04第四節:將JSON字符串轉換為JSON對象對於從後臺獲取的一般都是JSON字符串,什麼是JSON字符串呢?
  • 如何使用Promise.race() 和 Promise.any() ?
    什麼是 Promise ?MDN 上對 Promise 的定義:Promise 對象用於表示一個異步操作的最終完成 (或失敗)及其結果值。對於新手來說,這聽起來可能有點太複雜了。國外一位大什麼對Promises的解釋如下:「想像一下你是個孩子。你老媽向你保證,她下周會給你買一部新手機。」
  • 原生js與JQuery的ajax請求有什麼區別?
    原生js的ajax請求1.創建XMLHttpRequest對象2.準備發送請求 open()3.發送請求數據readyState狀態碼實例:get請求:post請求:方法封裝:JQuery的ajax請求$.ajax()eg:$.post()eg:$.get()
  • ES6之Promise的使用
    .} /* executor */ );參數executorexecutor是帶有 resolve 和 reject 兩個參數的函數 。Promise構造函數執行時立即調用executor 函數, resolve 和 reject 兩個函數作為參數傳遞給executor(executor 函數在Promise構造函數返回新建對象前被調用)。
  • 初識javascript,JS的歷史_騰訊新聞
    javascript和H5的關關係 什麼是HTML5?javascript的由來 JavaScript誕生於1995年。
  • HTML的DIV布局的實際問題詳解,精通。DIV浮動布局,塌陷
    各位讀者大家好,我是自學代碼的小張,在這裡與大家分享自學經驗和一些建議,專攻html,div+css,javascript,jquery,ajax,java,php,還有一其它的一些前端框架。小張也是自學,有不足的地方還望大家不吝賜教~~感謝支持!
  • 什麼是JavaScript對象?如何創建並引用?這就告訴你!
    因為對象能幫我們解決一些複雜的問題一、對象概述在JavaScript 中的所有事物都是對象:字符串(new String)、布爾(new Boolean())、數值(Number)、數組(Array)、函數(Function)等。
  • Javascript去除字符串中的點或其他符號
    今天在寫一個前端頁面的時候遇到了一個ip參數問題,我想把ip值中的點替換成 - 的形式。在前端上使用javascript進行操作的。測試了兩次沒有好用,程序直接把整個字符串都進行了替換,在考慮這個是為什麼呢?
  • 總是用中文「懂」英語和用英語「懂」英語:pinky promise何意?
    總是用中文「懂」英語和用英語「懂」英語的差別:a pinky promise是什麼?3.When we pinky promise,we'll say: I pinky promise that blablabla.這麼「學並學好」就等於說:將來臨時想不起英語a pinky promise時,至少還有「說」上面英語與人溝通的能力。這就是用英語學英語帶來的英語交流能力。
  • 用Java語言巧妙實現javascript的運行
    Java前言在學習開發的過程中javascript是每位程式設計師小盆友都得掌握的一種方法,他們可以說是貫穿了整個Java開發的語言,下面給大家演示一下在Java中如何完美運行javascript案例,跟著小編一起來學習一下吧
  • promise.race的用法——Vickey前端學習筆記
    記錄一下下午學習到的內容下午遇到一個問題,wx.request 有設置一個timeout 參數,但是要求基本庫2.10.0 之上,我想自己實現。於是寫了一段代碼運行一下,就發現,即便第一個promise已成功返回,但是第二個promise的console.error 依然執行了。莫非,Promise.race 理解的有問題?好似說的不是人話,沒看懂。
  • 周推歌曲《I promise》——獻給所有一直保持本真的人兒
    真相就是我不知道自己在做什麼 但我一直不懈努力I'd be lying if I were to sit here and tell you that I am如果我就這樣坐下來 告訴你我能約束自己In control know where I'm going then again也知道自己該往哪兒走 那我一定在撒謊
  • Javascript.info - 更新頻率極高的Javascript免費開源電子教程
    ES新標準以及帶來的新特性,都可以在這個教程上實時學習和查詢。介紹Javascript.info 是一個以最新JavaScript 標準為基準的在線教程。Javascript.info 首頁截圖Javascript.info 依託 learn.javascript.ru 而來的,learn.javascript.ru 是俄羅斯最大的 JavaScript 教程和學習平臺之一。
  • 九個難以置信的HTML5和JavaScript實驗
    【IT168 評論】  Google的 Chrome實驗室 收集了很多讓人難以置信的基於 HTML5 Canvas 和 JavaScript 的實驗項目,裡面的例子都很獨特,讓人驚嘆。我從未想過結合 HTML 和 JavaScript 能實現這麼強大的效果。