亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

在Promise鏈中共享變量的方法

發布時間:2020-06-05 17:38:43 來源:億速云 閱讀:219 作者:Leah 欄目:web開發

怎么在Promise鏈中共享變量?其實要解決這個問題也不難,為此小編總結了這篇文章,下面我們一起來看看在Promise鏈中共享變量的方法。

問題

connection變量在A處定義,在BC處都需要使用。但是,由于A、B、C處于各自獨立的作用域,connection變量將不能在BC處直接使用。

db.open()
    .then(connection => // A
    { 
        return connection.select(
        {
            name: 'Fundebug'
        });
    })
    .then(result =>
    {
        connection.query(); // B
    })
    .catch(error =>
    {
        // ...
    })
    .finally(() =>
    {
        connection.close(); // C
    });

方法1:使用高階作用域變量

在更高階的作用域定義connection變量,在D處賦值,這樣在BC處直接使用了。

let connection; // A
db.open()
    .then(conn =>
    {
        connection = conn; // D
        return connection.select(
        {
            name: 'Fundebug'
        });
    })
    .then(result =>
    {
        connection.query(); // B
    })
    .catch(error =>
    {
        // ...
    })
    .finally(() =>
    {
        connection.close(); // C
    });

問題:如果需要共享的變量過多(這是很常見的情況),則需要在高階作用域中定義很多變量,這樣非常麻煩,代碼也比較冗余。

方法2:嵌套作用域

將需要使用connection變量的Promise鏈內嵌到對應then回調函數中,這樣在BC處直接使用了。

db.open()
    .then(connection => // A
        {
            return connection.select(
                {
                    name: 'Fundebug'
                })
                .then(result =>
                {
                    connection.query(); // B
                })
                .catch(error =>
                {
                    // ...
                })
                .finally(() =>
                {
                    connection.close(); // C
                });
        });

問題:之所以使用Promise,就是為了避免回調地域,將多層嵌套的回調函數轉化為鏈式的then調用;如果為了共享變量采用嵌套寫法,則要Promise有何用?

方法3:return多個值

intermediate變量在A處定義并賦值,而在B處需要使用;但是,由于AB處于不同的作用域,B出并不能直接使用intermediate變量:

return asyncFunc1()
    .then(result1 =>
    { 
        const intermediate = ··· ; // A
        return asyncFunc2();
    })
    .then(result2 =>
    { 
        console.log(intermediate); // B
    });

A處使用Promise.all返回多個值,就可以將intermediate變量的值傳遞到B處:

return asyncFunc1()
    .then(result1 =>
    {
        const intermediate = ···; 
        return Promise.all([asyncFunc2(), intermediate]); // A
    })
    .then(([result2, intermediate]) =>
    {
        console.log(intermediate); // B
    });

問題:  使用Promise.all用于傳遞共享變量,看似巧妙,但是有點大材小用,并不合理;不能將變量傳遞到.catch()finally()中;當共享變量過多,或者需要跨過數個.then(),需要return的值會很多。

方法4: 使用Async/Await

Async/Await是寫異步代碼的新方式,可以替代Promise,它使得異步代碼看起來像同步代碼,可以將多個異步操作寫在同一個作用域中,這樣就不存在傳遞共享變量的問題了!!!

方法1中的示例可以改寫為:

try
{
    var connection = await db.open(); // A 
    const result = await connection.select(
    {
        name: 'Fundebug'
    });
    connection.query(); // B
}
catch (error)
{
    // ...
}
finally
{
    connection.close(); // C
}

方法3中的示例可以改寫為:

try
{
    result1 = await asyncFunc1();
    const intermediate = ··· ;
    result2 = await asyncFunc2();
    console.log(intermediate);
}
catch (error)
{
    // ...
}

毋庸贅言,Async/Await直接將問題消滅了。

看完這篇文章,你們學會在Promise鏈中共享變量的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。

向AI問一下細節

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

AI

庆元县| 海原县| 湘阴县| 闵行区| 尚志市| 白朗县| 宁安市| 从江县| 苏尼特右旗| 米林县| 广西| 呼和浩特市| 烟台市| 洛川县| 成安县| 古田县| 辉县市| 句容市| 章丘市| 措美县| 陆川县| 梁平县| 马关县| 上思县| 武汉市| 和顺县| 乌鲁木齐市| 唐山市| 澄城县| 盱眙县| 盐池县| 安福县| 彰化市| 柳河县| 瓮安县| 台东县| 木兰县| 武汉市| 临泽县| 昭苏县| 铁力市|