Promise異步練習題(梁王的理論自習室)

前言

我最近發(fā)現(xiàn)我一用Promise無法直接寫出來要看文檔,所以總結了個題鞏固一下。以后忘記了回來直接看這里例子立馬就能寫了,很穩(wěn)。

題目一(基本promise)

使用promise實現(xiàn):
開始的時候console.log('start')
等待3秒后console.log('first step finished')
之后用ajax對www.baidu.com發(fā)出get請求,
請求返回后結果給下個promise
console.log輸出結果

題目實現(xiàn)

var stepone = function() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('shit')
            resolve()
        }, 3000)
    })
}

var steptwo = function() {
    return new Promise((resolve, reject) => {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange=function()
        {
            if (xhr.readyState==4 && xhr.status==200) {
                resolve(xhr.responseText)
            } else if(xhr.readyState==4 && xhr.status / 100 == 4) {
                reject(xhr.responseText)
            }
        }
        xhr.open("GET","www.baidu.com",true);
        xhr.send();
    })
}

var stepthree = function(data) {
    return new Promise((resolve, reject) => {
        console.log(data);
    })
}
stepone()
    .then(steptwo)
    .then(stepthree);

題目二(promise.all和promise.race)

有些情況我們需要使用all或者race,一些比較典型的例子是如下

all: 有些情況下,你需要等兩個異步請求都完成之后才做某些操作,比如一個包含了文章內容和評論的頁面,需求是你開始加載的時候載入loading畫面,當內容和評論都加載完之后結束loading。這種情況就是用all了。
race: 有一些情況下,你只獲取返回最快的異步請求的數(shù)據(jù)(注意,其他的依舊會執(zhí)行完),比如如果我對一個圖片進行請求,那如果我過5秒之后還沒有接到返回我可能會想要做一些操作。

all

var getPromise = (value, delay) => {
  return new Promise(resolve => {
    setTimeout(() => resolve(value), delay);
  });
};

var promise1 = getPromise('value-1', 350);
var promise2 = getPromise('value-2', 250);
var promise3 = getPromise('value-3', 150);

var promise = Promise.all([promise1, promise2, promise3]);
promise
.then(result => {  
  console.log('result of promise:', result); 
})
.catch(error => {
  console.log('error', error);
});

race

以請求一個無法加載的圖片為例子

//請求某個圖片資源
function requestImg(){
    var p = new Promise(function(resolve, reject){
        var img = new Image();
        img.onload = function(){
            resolve(img);
        }
        img.src = 'xxxxxx';
    });
    return p;
}

//延時函數(shù),用于給請求計時
function timeout(){
    var p = new Promise(function(resolve, reject){
        setTimeout(function(){
            reject('圖片請求超時');
        }, 5000);
    });
    return p;
}

Promise
.race([requestImg(), timeout()])
.then(function(results){
    console.log(results);
})
.catch(function(reason){
    console.log(reason);
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 弄懂js異步 講異步之前,我們必須掌握一個基礎知識-event-loop。 我們知道JavaScript的一大特點...
    DCbryant閱讀 2,879評論 0 5
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 8,775評論 0 29
  • 去年6月份, ES2015正式發(fā)布(也就是ES6,ES6是它的乳名),其中Promise被列為正式規(guī)范。作為ES6...
    豬豬俠闖天下閱讀 983評論 0 0
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調函數(shù)和事件——更合理和更強大。它由社區(qū)...
    夜幕小草閱讀 2,225評論 0 12
  • 目錄 上一章:連橫問鼎關中(一) 第十四章:連橫問鼎關中(二) 進入野山,秦皇放出戰(zhàn)車,帶著鯊飛馳于半空中。冷風撲...
    靈夜狼閱讀 907評論 33 16

友情鏈接更多精彩內容