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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-12-04 20:11:16821ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。