ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript で Promise を使用した非同期チェーンを実現するにはどうすればよいですか?

JavaScript で Promise を使用した非同期チェーンを実現するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-04 20:11:16
オリジナル
805 人が閲覧しました

How to Achieve Asynchronous Chaining with Promises in JavaScript?

JavaScript ES6 での Promise による非同期チェーン

提供された JavaScript コード スニペットは、ループ内で Promise を作成しようとしますが、同期のため失敗します。ループの性質。これに対処するには、各 Promise を順番に作成して解決する必要があり、非同期になります。

この連鎖を実現するには、いくつかのアプローチがあります。

初期 Promise:

すぐに解決される Promise を初期化し、この最初の Promise に新しい Promise をチェーンします。以前の各 Promise が解決されます。

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
    p = p.then(() => delay(Math.random() * 1000))
         .then(() => console.log(i));
}
ログイン後にコピー

Initial Promise での Array.reduce の使用:

for ループのアプローチと同様に、Array.reduce を使用して Promise を連鎖させます。最初の Promise から始めます。

[...Array(10).keys()].reduce(
    (p, i) => p.then(() => delay(Math.random() * 1000)).then(() => console.log(i)),
    Promise.resolve()
);
ログイン後にコピー

再帰的に連鎖する関数:

現在のインデックスを引数として渡し、解決コールバック (プロミス チェーンのような) として自分自身を呼び出す関数を定義します。

const chainPromises = (i = 0) => {
    if (i >= 10) return;

    delay(Math.random() * 1000).then(() => {
        console.log(i);
        chainPromises(i + 1);
    });
};

chainPromises();
ログイン後にコピー

Async/Await の使用 (ES2017):

async/await を使用して、 Promise が解決されるまで関数の実行を一時停止します。

const asyncPromises = async () => {
    for (let i = 0; i < 10; i++) {
        await delay(Math.random() * 1000);
        console.log(i);
    }
};

asyncPromises();
ログイン後にコピー

Using For Await...Of (ES2020):

async/await と同様に、次を使用します。非同期イテラブルを反復するための for await... 構文。

const asyncPromises = async () => {
    for await (let i of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
        await delay(Math.random() * 1000);
        console.log(i);
    }
};

asyncPromises();
ログイン後にコピー

以上がJavaScript で Promise を使用した非同期チェーンを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート