AJAX和Promise及跨域

回調(diào)地獄

封裝ajax的時候,發(fā)現(xiàn):請求成功后的值不能直接返回給調(diào)用者迷殿,而需要在其內(nèi)部執(zhí)行一個回調(diào)函數(shù)儿礼。如果在請求一次后需要再次請求,那么庆寺,也就是在回調(diào)函數(shù)中需要再次調(diào)用ajax蚊夫,再次傳入回調(diào)函數(shù),次數(shù)多了以后就形成了回調(diào)地獄懦尝。難以使用及維護

回調(diào)地獄

解決:es6中的構(gòu)造函數(shù)Promise解決這個問題知纷。

基本語法:

new Promise(function (resolve, reject) {
                      // resolve 表示成功的回調(diào)
                      // reject 表示失敗的回調(diào)
                }).then(function (res) {
                      // 成功的函數(shù)
                }).catch(function (err) {
                      // 失敗的函數(shù)
                })

在promise中,提供了兩個參數(shù)陵霉,分別表示執(zhí)行成功和失敗的回調(diào)函數(shù)琅轧,執(zhí)行成功調(diào)用resolve,失敗調(diào)用reject即可踊挠,具體resolve和reject的執(zhí)行乍桂,分別在then和catch中冲杀。這樣可以將回調(diào)函數(shù)變成鏈式結(jié)構(gòu),從而解決了回調(diào)地獄的問題睹酌。
案例:

new Promise(function (resolve, reject) {
        ajax({
            url: '第一個請求',
            success(res) {
                resolve(res)
            }
        })
    }).then(function (res) {
        // 準備發(fā)送第二個請求
        return new Promise(function (resolve, reject) {
            ajax({
                url: '第二個請求',
                data: { a: res.a, b: res.b },
                success(res) {
                    resolve(res)
                }
            })
        })
    }).then(function (res) {
        ajax({
            url: '第三個請求',
            data: { a: res.a, b: res.b },
            success(res) {
                console.log(res)
            }
        })
    }).catch(function (res) {
    })

then和catch不會同時觸發(fā)权谁,也就是說,只要一個then出錯了憋沿,執(zhí)行最底下的catch就行旺芽,所以也就可以連續(xù)寫多個then,一個catch就行

終極解決方案:es7提供的async/await

可以將異步代碼寫的和同步代碼一樣
語法:

  asyncfunctionfn() {
                    constres=awaitpromise對象
                }

只要是一個 promiser 對象辐啄,那么我們就可以使用 async/await 來書寫
案例

async function fn() {
        const res = new Promise(function (resolve, reject) {
            ajax({
                url: '第一個地址',
                success(res) {
                    resolve(res)
                }
            })
        })
        // res 就可以得到請求的結(jié)果
        const res2 = new Promise(function (resolve, reject) {
            ajax({
                url: '第二個地址',
                data: { a: res.a, b: res.b },
                success(res) {
                    resolve(res)
                }
            })
        })
        const res3 = new Promise(function (resolve, reject) {
            ajax({
                url: '第三個地址',
                data: { a: res2.a, b: res2.b },
                success(res) {
                    resolve(res)
                }
            })
        })
        // res3 就是我們要的結(jié)果
        console.log(res3)
    }

跨域

原因是瀏覽器的同源策略
跨域:前端是不能跨域的采章,但是后端的語言可以。
概念:瀏覽器有同源策略壶辜,禁止ajax從一個域名請求另外一個域名上的數(shù)據(jù)悯舟,如果從一個域名請求另外一個域名上的數(shù)據(jù),就是跨域

那什么是同源策略砸民,所謂同源图谷,就是指域名、協(xié)議阱洪、端口都相同。比如說:一個瀏覽器打開百度的網(wǎng)站菠镇,然后在控制臺請求騰訊的網(wǎng)頁冗荸,瀏覽器會報一個不是同源的異常。
解決:

  • 1.php解決跨域:
    也就是說跨域請求只是限制客戶端向服務(wù)端利耍,如果是服務(wù)端向服務(wù)端請求的話就不存在這個問題蚌本,也就是說需要跨域的請求交給php服務(wù)端來做,有了結(jié)果再響應(yīng)給ajax即可隘梨。
    原理上利用的php的爬蟲技術(shù)程癌。有file_get_contents()、curl轴猎、ob_get_contents()
    在服務(wù)端設(shè)置響應(yīng)頭嵌莉,允許跨域請求
    如果請求的服務(wù)端是自己可操作的話,可以在php端設(shè)置允許跨域的響應(yīng)頭捻脖。代碼如下:header("Access-Control-Allow-Origin:*");
  • 2.配置nginx代理:
location = 自定義url {
proxy_pass 待跨域請求的地址
}
  • 3.通過jsonp來實現(xiàn):
    利用標簽可以跨域(當(dāng)前網(wǎng)頁的圖片鏈接可以是別的網(wǎng)站上的圖片)的特性锐峭,制作標簽進行跨域
var script = document.createElement('script');
    script.setAttribute('src', "http://www.php.com/test.php?callback=response");
    $('head').append(script);
    function response(res) {
        $('#result').text(res);
    }
    // php代碼:
    $fun = $_GET['callback'];
    echo "$fun(".$str.")";
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市可婶,隨后出現(xiàn)的幾起案子沿癞,更是在濱河造成了極大的恐慌,老刑警劉巖矛渴,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椎扬,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機蚕涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門筐赔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钻趋,你說我怎么就攤上這事川陆。” “怎么了蛮位?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵较沪,是天一觀的道長。 經(jīng)常有香客問我失仁,道長尸曼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任萄焦,我火速辦了婚禮控轿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拂封。我一直安慰自己茬射,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布冒签。 她就那樣靜靜地躺著在抛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萧恕。 梳的紋絲不亂的頭發(fā)上刚梭,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音票唆,去河邊找鬼朴读。 笑死,一個胖子當(dāng)著我的面吹牛走趋,可吹牛的內(nèi)容都是我干的衅金。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼簿煌,長吁一口氣:“原來是場噩夢啊……” “哼典挑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啦吧,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤您觉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后授滓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琳水,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡肆糕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了在孝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诚啃。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖私沮,靈堂內(nèi)的尸體忽然破棺而出始赎,到底是詐尸還是另有隱情,我是刑警寧澤仔燕,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布造垛,位于F島的核電站,受9級特大地震影響晰搀,放射性物質(zhì)發(fā)生泄漏五辽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一外恕、第九天 我趴在偏房一處隱蔽的房頂上張望杆逗。 院中可真熱鬧,春花似錦鳞疲、人聲如沸罪郊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排龄。三九已至,卻和暖如春翎朱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尺铣。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工拴曲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凛忿。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓澈灼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親店溢。 傳聞我的和親對象是個殘疾皇子叁熔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355