中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

好程序員web前端教程分享怎么用promise解決回調和異步

發布時間:2020-06-07 14:29:48 來源:網絡 閱讀:287 作者:wx5da18b5c4b01e 欄目:web開發

好程序員web前端教程分享怎么用promise解決回調和異步
首先讓我們看看下面這題輸出什么?

setTimeout(function() {
      console.log(1);
},1000)
console.log(2);

我們得到的結果是:先輸出2,后輸出1;這是什么原因呢?大家應該都知道定時器是異步的;所以先先輸出2;
那么我們的需求來了,怎么先輸出1,然后輸出2呢?

function foo(callback) {
setTimeout(function() {
    console.log(1);
    callback();
},1000)
}
foo(function() {
      console.log(2);
})

現在我們看看打印的結果吧,果然先輸出的1,然后輸出2了;這個是通過回調函數解決的;
現在我么你的需求變了,我們每隔1秒后做一次輸出;

function foo(callback) {
    setTimeout(function() {
        console.log('1秒后輸出');
        callback()
    }, 1000)
}
foo(function() {
    console.log('第一次輸出');
    foo(function() {
        console.log('第二次輸出');
        foo(function() {
            console.log('第二次輸出');
        })
    })
})

這樣是不是解決我們的問題了呢?

是的,但是如果我們多來幾次,大家會不會發現回調的太多了嗎?這就是大家所說的毀掉地獄;

###所以ES6給我們提供了一個解決毀掉地獄的方法:promise;
promise是一種用異步的方式處理值的方法,promise是一個對象,解決層層嵌套問題
####promise對象的狀態:

進行中: pending
成功: resovled
失敗: rejected

promise對象的方法:

then() 成功后執行; 如果有兩個參數:第一個參數成功后執行,第二個參數失敗后執行;
catch() 失敗后執行;
人promise all([]).then() 都成功后執行圖then的第一個方法;
promise.race[(p1,p2,p3,---)] 只要有一個率先改變狀態,promise就會執行對應的狀態

var promise = new Promise(function (resolved, rejected) {
resolved('ok'); 
rejected('no');
//如果成功和失敗同時寫,執行先寫的;(特點狀態一旦改變,就不可逆了)
});
promise.then(function(msg) {
console.log('ok:' + msg);
},function (msg) {
console.log('no:' + msg);
});

打印結果是: ok: ok
現在我們做一個練習: 使用promise 加載一張圖片;加載成功就將圖片加載到body中,如果加載失敗,提示失敗;

var promise = new Promise(function (resolved, rejected) {
var img = document.createElement('img');
img.src = './img/1.png';
img.onload = function () {
resolved(img)   //如果加載成功就返回resolved()
}
img.onerror = function () {
rejected('失敗')    //如果加載成功就返回rejected()
}
})
promise.then(function (msg) {
document.body.appendChild(msg)
},function (msg) {
alert(msg)
})

怎么樣大家是不是對promise有了了解?
那么怎么用promise解決異步的問題呢?我們還是每隔1秒后做一次輸出;
```function fn() {
var promise = new Promise(function(resolved, rejected) {
setTimeout(function() {
console.log('每隔一秒');
resolved()
}, 1000)
});
return promise;
}
fn().then(function() {
console.log('第一次輸出');
return fn()
}).then(function() {
console.log('第二次輸出');
return fn()
}).then(function () {
console.log('第三次輸出');
})

那Promise如何解決ajax回調的問題呢?咱們繼續往下看.

function ajaxPromise(url) {
var promise = new Promise(function(resolved, rejected) {
var xhr = new XMLHttpRequest();
xhr.open('get', url);
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
resolved( xhr.responseText); //告訴promise成功了
}
}
setTimeout(function () {//5秒后請求不到
rejected('error') //告訴promise失敗了
},5000)
})
return promise;
}
document.onclick = function () {
var pro = ajaxPromise('data.json');
pro.then(function (msg) {
alert(msg) //如果路徑對了,我們得到了數據
},function (msg) {
alert(msg) //如果路徑錯了我們彈出error
})
}

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芮城县| 湾仔区| 甘肃省| 兖州市| 满城县| 西青区| 钟山县| 姜堰市| 河东区| 济南市| 彰化县| 蓝山县| 柯坪县| 铜鼓县| 日土县| 巴林右旗| 沁源县| 漳平市| 合阳县| 故城县| 禹城市| 大田县| 乐业县| 洞口县| 河南省| 武夷山市| 原阳县| 宜城市| 招远市| 沁源县| 萨嘎县| 蓬溪县| 南雄市| 彭泽县| 岚皋县| 炎陵县| 梅河口市| 连平县| 花莲县| 保康县| 庄浪县|