成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

promise初識(shí)

codercao / 1359人閱讀

摘要:一涉及技術(shù)二簡(jiǎn)介官方文檔三種狀態(tài)進(jìn)行中已完成,又稱已失敗只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài)。

一、涉及技術(shù)

jquery、vue、php

二、Promise簡(jiǎn)介

MDN官方文檔:Promise

三種狀態(tài):

Pending(進(jìn)行中)

Resolved(已完成,又稱 Fulfilled)

Rejected(已失敗)

只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài)。

三、常用方法

Promise.resolve()

Promise.reject()

Promise.prototype.catch()

Promise.prototype.then()

Promise.all()

Promise.race()

四、簡(jiǎn)單示例 1、多個(gè)Promise使用
var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        resolve("hello");
    }, 1000);
});
promise.then(function(str) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(str+" world");
        }, 1000);
    });
}).then(function(str) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(str+" !");
        }, 1000);
    });
}).then(function(str) {
    console.log(str); // 3秒后打印 hello world !
});
2、catch與finaly
var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        reject("異步報(bào)錯(cuò)~");
    }, 1000);
}).catch(function(err) { // 捕獲reject暴露的錯(cuò)誤
    console.log(err);
}).finally(function() { // 不管resolve/reject都執(zhí)行
    console.log("complete");
});
五、前后端配合 1、單個(gè)Promise

后端數(shù)據(jù)

demo.php

// 獲取隨機(jī)字符串
function getRandChar($length) {
    $str = "";
    $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    $max = strlen($strPol)-1;
    for($i=0;$i<$length;$i++){
        $str.=$strPol[rand(0,$max)];
    }
    return $str;
}
if($_GET["action"] == "test") {
    $data = [
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
        ["name"=>getRandChar(6), "age"=>rand(1,50)],
    ];
    echo json_encode($data);
}

前端頁(yè)面

demo.html




    
    promise
    
    


    
    
  • {{ index }} {{ item.name }}

運(yùn)行結(jié)果:

2、Promise.all()
Promise.all(p1, p2, ...),此方法需要所有的promise都成功才成功。。
var promise1 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("請(qǐng)求報(bào)錯(cuò)~");
        }
    });
});
var promise2 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("請(qǐng)求報(bào)錯(cuò)~");
        }
    });
});
var promiseAll = Promise.all([promise1, promise2]);
promiseAll.then(function(data) {
    console.log(data);
}, function(err) {
    console.log(err);
});

結(jié)果

如果我們把其中一個(gè)url 改成 demo2.php?action=test 就會(huì)請(qǐng)求失敗~

Promise.all() 和 jquery的$.when() 有些類似

$.when()的寫法

var ajax1 = $.ajax({type: "get", url: "demo1.php", data: {}, dataType: "json"}),
    ajax2 = $.ajax({type: "get", url: "demo2.php", data: {}, dataType: "json"}),
    ajax3 = $.ajax({type: "get", url: "demo3.php", data: {}, dataType: "json"});
$.when([ajax1, ajax2, ajax3]).then(function(data1, data2, data3) {
    console.log(data1, data2, data3);
}, function() {
    console.log("%c 請(qǐng)求報(bào)錯(cuò)~", "color: red");
});
3、Promise.race()
Promise.race(p1, p2, ...),這個(gè)方法會(huì)返回率先成功的那個(gè),如果都不成功,則執(zhí)行reject。
var promise1 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("請(qǐng)求報(bào)錯(cuò)~");
        }
    });
});
var promise2 = new Promise(function(resolve, reject) {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res);
        },
        error: function() {
            reject("請(qǐng)求報(bào)錯(cuò)~");
        }
    });
});

var promiseRase = Promise.race([promise1, promise2]);
promiseRase.then(function(data) {
    console.log(data);
}, function(err) {
    console.log(err);
});
4、多個(gè)ajax請(qǐng)求
var app = new Vue({
    el: "#app",
    data: {
        list: []
    },
    methods: {
        ajaxReq: function(resolve, reject) {
            $.ajax({
                type: "get",
                url: "demo.php?action=test",
                dataType: "json",
                success: function(res) {
                    resolve(res);
                },
                error: function() {
                    reject("請(qǐng)求報(bào)錯(cuò)~");
                }
            });
        }
    },
    mounted: function() {
        var promise1 = new Promise((resolve, reject) => {
            this.ajaxReq(resolve, reject);
        });
        promise1.then((data)=> {
            console.log("第一次:", data);
            return new Promise((resolve, reject) => {
                this.ajaxReq(resolve, reject);
            });
        }).then((data) => {
            console.log("第二次:", data);
            return new Promise((resolve, reject) => {
                this.ajaxReq(resolve, reject);
            });
        }).then((data) => {
            console.log("第三次:", data);
        });
    }
});

這是使用了函數(shù)封裝,實(shí)際上項(xiàng)目中,可能不是這樣的,連貫操作,可能是下一個(gè)請(qǐng)求需要上一個(gè)請(qǐng)求的返回值

var promise1 = new Promise((resolve, reject) => {
    $.ajax({
        type: "get",
        url: "demo.php?action=test",
        dataType: "json",
        success: function(res) {
            resolve(res, 2);
        },
        error: function() {
            reject("請(qǐng)求報(bào)錯(cuò)~");
        }
    });
});
promise1.then((data)=> {
    if(data.length > 0) {
        return new Promise((resolve, reject) => {
                    $.ajax({
                        type: "get",
                        url: "demo.php?action=test",
                        dataType: "json",
                        success: function(res) {
                            resolve(res.concat(data)); // 因?yàn)閞esolve只能接口一個(gè)參數(shù),所以concat了一下
                        },
                        error: function() {
                            reject("請(qǐng)求報(bào)錯(cuò)~");
                        }
                    });
                });   
    }
}).then((data1) => {
    console.log(data1);
});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89384.html

相關(guān)文章

  • 初識(shí)fetch

    摘要:后面可以跟對(duì)象,表示等待才會(huì)繼續(xù)下去執(zhí)行,如果被或拋出異常則會(huì)被外面的捕獲。沒(méi)有獲取狀態(tài)方法,標(biāo)準(zhǔn)沒(méi)有提供獲取當(dāng)前狀態(tài)或者的方法。只允許外部傳入成功或失敗后的回調(diào)。這種進(jìn)度通知的功能還沒(méi)有用過(guò),暫不知道如何替代。 始終不是很懂fetch的作用,然后查了很多資料,看了一篇不錯(cuò)的文章,結(jié)合自己之前學(xué)習(xí)的Promise,然后做一篇文章,稍微記錄一下。傳統(tǒng) Ajax 已死,F(xiàn)etch 永生 雖...

    rickchen 評(píng)論0 收藏0
  • Generator初識(shí)

    摘要:一簡(jiǎn)介函數(shù)是引入的新型函數(shù),用于異步編程,跟對(duì)象聯(lián)合使用的話會(huì)極大降低異步編程的編寫難度和閱讀難度。二簡(jiǎn)單示例和注意函數(shù)不能直接使用,是通過(guò)方法獲取的返回結(jié)果,而可以提前終止函數(shù)。 一、簡(jiǎn)介 Generator函數(shù)是ES6引入的新型函數(shù),用于異步編程,跟Promise對(duì)象聯(lián)合使用的話會(huì)極大降低異步編程的編寫難度和閱讀難度。 與普通函數(shù)的區(qū)別: function關(guān)鍵字與函數(shù)名之間有一個(gè)...

    beita 評(píng)論0 收藏0
  • 初識(shí)JavaScript EventLoop

    摘要:指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。環(huán)境中的執(zhí)行順序是隨機(jī)的這一次,徹底弄懂執(zhí)行機(jī)制的規(guī)范和實(shí)現(xiàn) showImg(https://segmentfault.com/img/remote/1460000012913034?w=800&h=421); Event Loop指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。JavaScript采用此機(jī)制解決單線程引發(fā)相關(guān)問(wèn)題 在瀏覽器中的web應(yīng)用會(huì)涉及到.Jav...

    ZHAO_ 評(píng)論0 收藏0
  • 初識(shí)vue-element-admin

    摘要:最近看了一下項(xiàng)目,它是基于創(chuàng)建的項(xiàng)目創(chuàng)建項(xiàng)目安裝默認(rèn)手動(dòng)選擇配置,看個(gè)人項(xiàng)目需求支持使用書(shū)寫源碼支持。支持代碼風(fēng)格檢查和格式化。權(quán)限驗(yàn)證那里也做了遞歸的處理不顯示在菜單欄。組件內(nèi)的在組件內(nèi)使用可以拿到 最近看了一下vue-element-admin項(xiàng)目,它是基于vue-cli3創(chuàng)建的項(xiàng)目 創(chuàng)建vue-cli3項(xiàng)目 安裝vue-cli npm install -g @vue/cli v...

    My_Oh_My 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<