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

溫馨提示×

溫馨提示×

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

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

JavaScript中Promise遇到的問題怎么解決

發布時間:2023-05-04 11:08:16 來源:億速云 閱讀:110 作者:zzz 欄目:開發技術

這篇文章主要介紹“JavaScript中Promise遇到的問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“JavaScript中Promise遇到的問題怎么解決”文章能幫助大家解決問題。

什么是Promise

國內比較流行的看法:

阮一峰: Promise 對象

Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。

1. 是否可以使用return 代替 resolve

不可以,無法實現鏈式調用,且不符合規范。

示例:

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            return 'this is return';
            resolve('true');
            console.log('this will not be exec');
            throw new Error('error');
        }else{
            reject('false');
        }
    })
}

執行結果:

 ~ ts-node return.ts
Promise { <pending> }
  • 無法改變狀態

  • 無法鏈式調用

2. 使用throw還是reject?

答案: 使用reject而不是throw

示例1:不會被catch的throw Error

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            resolve('true');
            console.log('this will be exec');
            throw new Error('error');
        }else{
            reject('false');
        }
    })
}

console.log(testReturn(true));

執行結果

 ~/chen/FE/winSep/codes/javascript/es6promise/src  ts-node return.ts
this will be exec
Promise { 'true' }

解釋:

Promise的構造函數,以及被 then 調用執行的函數基本上都可以認為是在 try&hellip;catch 代碼塊中執行的,所以在這些代碼中即使使用 throw ,程序本身也不會因為異常而終止。Promise的狀態也不會發生改變。

示例2:不使用reject而使用throw

如果在Promise中使用 throw 語句的話,會被 try...catch 住,最終promise對象也變為Rejected狀態。

var promise = new Promise(function(resolve, reject){
    throw new Error("message");
});
promise.catch(function(error){
    console.error(error);// => "message"
});

運行

Error: message

代碼像這樣其實運行時倒也不會有什么問題,但是如果想把 promise 設置為Rejected狀態的話,使用 reject 方法則更顯得合理。

所以上面的代碼可以改寫為下面這樣。

var promise = new Promise(function(resolve, reject){
    reject(new Error("message"));
});
promise.catch(function(error){
    console.error(error);// => "message"
})

總結:如果在Promise中使用 throw 語句的話,會被 try...catch 住,最終promise對象也變為Rejected狀態。

3. Promise的執行時間

3.1 resolve后面的代碼會不會被執行?

當沒有Error的時候, resolve會將Promise.then放在微任務隊列中,當所有的宏任務執行結束的時候,執行微任務隊列。

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            resolve('exec true');
            console.log('this will be exec');
            // throw new Error('error');
        }else{
            reject('false');
        }
    })
}
testReturn(true).then(str=>{
    console.log(str);
})

執行結果

this will be exec
exec true

當有Error的時候,Error后面的代碼不會被執行,但是Promise的結果依舊是fulfilled

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        if(a){
            resolve('exec true');
            console.log('this will be exec');
            throw new Error('error');
            console.log('this will not be exec')
        }else{
            reject('false');
        }
    })
}


testReturn(true).then(str=>{
    console.log(str);
    // console.log(testReturn)
}).catch(err=>{
    console.log('err: ',err);
})

執行結果

this will be exec
exec true

3.2 當Promise遇到setTimeout

看例子:

const testReturn = (a:boolean):Promise<any> =>{
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            if(a){
                resolve('exec true');
                console.log('this will be second exec');
            }else{
                reject('false');
            }
        })
        console.log('this will first be execd');
    })
}


testReturn(true).then(str=>{
    console.log(str);
    // console.log(testReturn)
}).catch(err=>{
    console.log('err: ',err);
})

結果

this will first be execd
this will be second exec
exec true

解釋:

時間宏任務隊列微任務隊列
1console.log('this will first be execd')
2setTimeout
3
resolve('exec true');//延遲:因為宏任務沒有執行完
4console.log('this will be second exec');

最終執行順序:

1->2->4(宏任務結束)->3(微任務結束)

3.3 async/await 與Promise

一句話總結: await等的就是一個Promise 。如果等的不是Promise ,那加了await和不加沒區別

  • 將常規的回調轉變為Promise的方法

function util(args,callback){
    if(err){
        return callback(err);
    }else{
        return callback();
    }
}

//調用
util(args,(err)=>{
    if(err){
        
    }else{
        
    }
})
//Promisify

function utilPromise(args){
    return new Promise((resolve,reject)=>{
        if(err){
            reject(err)
        }else{
            resolve();
        }
    })
}

//調用
 utilPromise.then().catch()
  • Promise轉換為async/await的方法

async init(){
    try{
        await utilPromise();//resolve狀態
    }catch(e){
        throw new Error(e); //reject狀態
    }	
}

關于“JavaScript中Promise遇到的問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

汝州市| 蒲城县| 临城县| 南靖县| 六盘水市| 合作市| 肇庆市| 偃师市| 皋兰县| 清河县| 额济纳旗| 津南区| 海晏县| 昭平县| 满洲里市| 天津市| 惠东县| 洪洞县| 陆川县| 林甸县| 天等县| 久治县| 新宁县| 邢台县| 鞍山市| 河南省| 老河口市| 白银市| 衡水市| 静乐县| 靖宇县| 信阳市| 禄丰县| 西充县| 丰城市| 巢湖市| 阳曲县| 应用必备| 鸡泽县| 高青县| 屏东县|