最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中如何處理承諾demo

 更新時(shí)間:2022年12月13日 09:39:44   作者:Jovie  
這篇文章主要為大家介紹了React中如何處理承諾demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

諾言本質(zhì)上是一種處理異步操作的方式,一個(gè)常見的例子是在React中執(zhí)行API請求。為了在React生命周期中使用這些操作,我們可以使用useState鉤子來存儲(chǔ)承諾的結(jié)果,當(dāng)它被解決并重新渲染組件。

本教程假設(shè)你熟悉React中鉤子的使用,所以如果你不確定,請查看我們的介紹

什么是 "承諾"?

諾言允許你在JavaScript中執(zhí)行異步操作。要從頭開始構(gòu)建一個(gè)Promise,你可以使用Promise構(gòu)造器。這個(gè)函數(shù)需要兩個(gè)參數(shù):"resolve",當(dāng)操作完成時(shí)調(diào)用的函數(shù),以及 "reject",當(dāng)操作失敗時(shí)調(diào)用的函數(shù)。然后,當(dāng)你的操作完成時(shí),你必須調(diào)用這些函數(shù)中的一個(gè)。

JavaScript給了你兩種處理承諾結(jié)果的方法,第一種是 .then(),一個(gè)以函數(shù)為參數(shù)的函數(shù),它將把解決后的值傳遞給該函數(shù):

const promiseThen = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('Hi!');
    }, 1000);
});
promiseThen
    .then((val) => {
        console.log(val);
    })
    .catch((err) => console.log(err));

其他的東西都不會(huì)等待你的承諾解決,但是你提供給 ***.then()***將在承諾解析時(shí)運(yùn)行。

另一種方法是 "async/await "功能,這通常是首選;如果你 "等待 "一個(gè)承諾,代碼將停止運(yùn)行,直到承諾完成。下面是上面的例子,重寫后使用了await來代替:

const promiseAwait = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('Hi!');
    }, 1000);
});
const result = await promiseAwait;
console.log(result);

在React的頁面加載中使用承諾

要在React中使用一個(gè)Promise的值,你可以使用一個(gè) ***useEffect()***鉤子,用一個(gè)空的依賴數(shù)組來等待承諾的解析,并將結(jié)果存儲(chǔ)在useState鉤子的值中。

下面是一個(gè)使用該方法獲得一只隨機(jī)貓的例子,使用CatAAS API:

function PromisesPage() {
    const [catUrl, setCatUrl] = useState('');
    const [error, setError] = useState(false);
    const [state, setState] = useState('');
    useEffect(() => {
        setState('loading');
        axios
            .get('https://cataas.com/cat?json=true')
            .then((res) => {
                console.log(res);
                setState('success');
                setCatUrl('https://cataas.com' + res.data.url);
            })
            .catch((err) => {
                console.error('Error:', err);
                setState('error');
                setError(err);
            });
    }, []);
    if (state === 'error')
        return (
            <h1>
                {error.toString()}
            </h1>
        );
    return (
        <div>
            <div>
                {state === 'loading' ? (
                    <h1>Loading...</h1>
                ) : (
                    <img src="{catUrl}" />
                )}
            </div>
        </div>
    );
}

當(dāng)頁面加載時(shí),useEffect的函數(shù)將被調(diào)用。這將使用axios庫執(zhí)行API調(diào)用,你可以在這里這里找到更多信息。當(dāng)我們的API調(diào)用正在進(jìn)行時(shí),我們會(huì)看到一個(gè)加載屏幕;這是一個(gè)讓你的用戶了解正在發(fā)生什么的好主意。當(dāng)承諾解決時(shí),我們得到我們所收到的貓,并將其存儲(chǔ)在我們的狀態(tài)中。組件重新渲染,你的貓就被顯示出來了

注意:假設(shè)你的承諾可能會(huì)失敗,并為這種可能性做好準(zhǔn)備,這是一個(gè)好主意。在這種情況下,如果一個(gè)錯(cuò)誤被拋出,我們會(huì)設(shè)置一個(gè)不同的狀態(tài)變量,組件會(huì)重新渲染,并顯示我們的錯(cuò)誤信息。

如果你喜歡異步編程的await語法,你可能會(huì)發(fā)現(xiàn)上面的代碼有問題。重寫它以使用await,你可以這樣寫。

    useEffect(() => {
            setState('loading');
            try {
                const res = await axios.get('https://cataas.com/cat?json=true');
                setCatUrl(res.data.url);
                setState('success');
            } catch (e) {
                setError(e);
            }
    }, []);

但這將引發(fā)一個(gè)錯(cuò)誤,因?yàn)槲覀冊噲D在一個(gè)非異步函數(shù)中使用await。我們也不能通過將簽名改為 "async () =>"來使useEffect的函數(shù)成為異步函數(shù),因?yàn)閡seEffect函數(shù)必須是同步的。

    useEffect(() => {
        (async () => {
            setState('loading');
            try {
                const res = await axios.get('https://cataas.com/cat?json=true');
                setCatUrl(res.data.url);
                setState('success');
            } catch (e) {
                setError(e);
            }
        })();
    }, []);
    useEffect(() => {
        const fetchCat = async () => {
            setState('loading');
            try {
                const res = await axios.get('https://cataas.com/cat?json=true');
                setCatUrl(res.data.url);
                setState('success');
            } catch (e) {
                setError(e);
            }
        };
        fetchCat();
    }, []);

我們可以用IIFE來解決這個(gè)問題,也就是Immediately-Invoked Function Expression。這本質(zhì)上只是定義了一個(gè)函數(shù)并立即調(diào)用它,這意味著我們可以在useEffect內(nèi)部的異步函數(shù)中等待我們的承諾。

點(diǎn)擊時(shí)

在上面的例子中,我們必須刷新頁面才能得到一只新貓。這有點(diǎn)不方便,所以讓我們重構(gòu)我們的網(wǎng)站,這樣我們就可以通過一個(gè)按鈕獲得一只新貓。

function PromisesPage() {
    const [catUrl, setCatUrl] = useState('');
    const [error, setError] = useState(false);
    const [state, setState] = useState('');
    function fetchCat() {
        setState('loading');
        axios
            .get('https://cataas.com/cat?json=true')
            .then((res) => {
                console.log(res);
                setState('success');
                setCatUrl('https://cataas.com' + res.data.url);
            })
            .catch((err) => {
                console.error('Error:', err);
                setState('error');
                setError(err);
            });
    }
    useEffect(() => {
        fetchCat();
    }, []);
    if (state === 'error')
        return (
            <h1>
                {error.toString()}
            </h1>
        );
    return (
        <div>
            <div>
                {state === 'loading' ? (
                    <h1>Loading...</h1>
                ) : (
                    <img src="{catUrl}" />
                )}
            </div>
            <button>
                New Cat?
            </button>
        </div>
    );
}

我們把useEffect函數(shù)的內(nèi)容重構(gòu)為自己的獨(dú)立函數(shù),這樣我們就可以隨時(shí)觸發(fā)它了

現(xiàn)在,當(dāng)我點(diǎn)擊按鈕時(shí),onClick按鈕會(huì)觸發(fā)我們的API請求。當(dāng)我們的承諾得到解決時(shí),該值被存儲(chǔ)在狀態(tài)中,這就觸發(fā)了一次重新渲染。

在這個(gè)例子中,我使用了一個(gè)API調(diào)用,但你可以用任何承諾來代替它,不管是像useTimeout這樣簡單的東西,還是更復(fù)雜的東西。如果你喜歡這篇文章,如果我?guī)椭鉀Q了你的問題,或者你有任何問題,請?jiān)谙旅娴脑u(píng)論中告訴我。

以上就是React中如何處理承諾demo的詳細(xì)內(nèi)容,更多關(guān)于React處理承諾的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入React?18源碼useMemo?useCallback?memo用法及區(qū)別分析

    深入React?18源碼useMemo?useCallback?memo用法及區(qū)別分析

    這篇文章主要為大家介紹了React?18源碼深入分析useMemo?useCallback?memo用法及區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 使用React制作一個(gè)貪吃蛇游戲的代碼詳解

    使用React制作一個(gè)貪吃蛇游戲的代碼詳解

    Snake?Game?使用?ReactJS?項(xiàng)目實(shí)現(xiàn)功能組件并相應(yīng)地管理狀態(tài),開發(fā)的游戲允許用戶使用箭頭鍵控制蛇或觸摸屏幕上顯示的按鈕來收集食物并增長長度,本文給大家詳細(xì)講解了如何使用?React?制作一個(gè)貪吃蛇游戲,需要的朋友可以參考下
    2023-11-11
  • 深入理解React與閉包的關(guān)系

    深入理解React與閉包的關(guān)系

    本文將深入探討React與閉包之間的關(guān)系,我們將首先介紹React和閉包的基本概念,然后詳細(xì)解釋React組件中如何使用閉包來處理狀態(tài)和作用域的問題,希望通過本文的閱讀,你將對React中閉包的概念有更深入的理解,并能夠在開發(fā)React應(yīng)用時(shí)更好地應(yīng)用閉包
    2023-07-07
  • React組件的應(yīng)用介紹

    React組件的應(yīng)用介紹

    React組件分為函數(shù)組件與class組件;函數(shù)組件是無狀態(tài)組件,class稱為類組件;函數(shù)組件只有props,沒有自己的私有數(shù)據(jù)和生命周期函數(shù);class組件有自己私有數(shù)據(jù)(this.state) 和 生命周期函數(shù)
    2022-09-09
  • 使用React-Router時(shí)出現(xiàn)的錯(cuò)誤及解決

    使用React-Router時(shí)出現(xiàn)的錯(cuò)誤及解決

    這篇文章主要介紹了使用React-Router時(shí)出現(xiàn)的錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React項(xiàng)目中不需要jQuery原因分析

    React項(xiàng)目中不需要jQuery原因分析

    在Web開發(fā)的早期,jQuery是一個(gè)革命性的庫,它極大地簡化了DOM操作、事件處理、動(dòng)畫制作以及Ajax請求等任務(wù),React的出現(xiàn),jQuery在新項(xiàng)目中的必要性開始受到質(zhì)疑,本文將探討為什么在React應(yīng)用中不需要jQuery,感興趣的朋友可以參考下
    2024-02-02
  • react項(xiàng)目中redux的調(diào)試工具不起作用的解決

    react項(xiàng)目中redux的調(diào)試工具不起作用的解決

    這篇文章主要介紹了react項(xiàng)目中redux的調(diào)試工具不起作用的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 解決webpack -p壓縮打包react報(bào)語法錯(cuò)誤的方法

    解決webpack -p壓縮打包react報(bào)語法錯(cuò)誤的方法

    這篇文章主要給大家介紹了關(guān)于解決webpack -p壓縮打包react報(bào)語法錯(cuò)誤的方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • react實(shí)現(xiàn)動(dòng)態(tài)選擇框

    react實(shí)現(xiàn)動(dòng)態(tài)選擇框

    這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)動(dòng)態(tài)選擇框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React 中引入 CSS 高階用法的方案詳解

    React 中引入 CSS 高階用法的方案詳解

    這篇文章主要介紹了React中引入CSS高階用法的方案詳解,至于使用react用哪種方案引入css,并沒有一個(gè)絕對的答案,可以根據(jù)各自情況選擇合適的方案,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

凤台县| 太和县| 常熟市| 旬阳县| 呼图壁县| 抚松县| 康马县| 凤城市| 海城市| 海宁市| 镇江市| 绥江县| 桓仁| 观塘区| 辽阳市| 安新县| 桂林市| 横峰县| 莱州市| 周口市| 旌德县| 邵东县| 张掖市| 瑞丽市| 永春县| 洪雅县| 建宁县| 怀柔区| 通海县| 安图县| 福鼎市| 山阳县| 锡林浩特市| 娄底市| 满洲里市| 阳城县| 海林市| 九台市| 蕲春县| 昌吉市| 西安市|