84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
同期はただの同期ではなく、非同期はただの非同期ではないでしょうか?同期的な方法で非同期的に書き込むとはどういう意味ですか?
欢迎选择我的课程,让我们一起见证您的进步~~
非同期呼び出しは現在のスレッドに対して非ブロックであるため、非同期処理が完了したかどうか、またはエラーが発生したかどうかを知りたい場合は、通常、Node.js で一般的なイベントまたはコールバックを通じて実現されます。 Ajax は非常に典型的な非同期呼び出しであり、jQuery.ajax を例に挙げます
jQuery の Ajax は jQuery の Promise オブジェクトを返します。通常、done()回调来处理调用完成之后的事情。但实际它也有标准 Promise 的then(),所以上面的done是可以改成then的,但是要注意,done是以事件的形式注册回调,它返回当前这个 Promise 对象本身,可以链式调用注册若干个回调。而thenを使用して別の Promise オブジェクトを返します (標準の Promise 仕様)。呼び出しが連鎖している場合、各呼び出しは同じ Promise オブジェクトに対して作用しません。
done()
then()
done
then
コールバックで別の非同期呼び出しを行う必要がある場合は、コールバックに別のコールバックを登録する必要があります。たとえば、特定のデータを取得するには、まず api1 から特定の値を取得し、次にこの値を使用して api2 から特定のリソースを取得し、次にこのリソースの特定の値を使用して api3 からこの値を取得する必要があります。書くと次のようになります:
これはまだ 3 番目のレベルです...非常に恐ろしいフォームです。この形態を「コールバック地獄」と呼びます。
この問題を解決するために、誰もがさまざまな方法を考えてきました。Promise もその 1 つですが、Promise はまだこの形式を完全に取り除くことができません。 co ライブラリも解決策の 1 つですが、完全に排除することはできません。
ただし、ES2017ではasync/awaitが導入され、いわゆる同期形式での非同期書き込みが可能になりました。例えば、上記のコードは
async/await はコールバックを排除するため、非同期 (つまり同期) コードを作成するのと同じように見えます。
参考:
非同期呼び出しの「フラット化」について話します
地獄から天国へ、ノードのコールバックが async/await に変更されます
JavaScript の async/await を理解する
非同期の場合、次の形式でコールバック関数をネストするのが一般的です。
この時点で、コールバックのネストが表示されますが、これは層ごとにネストする必要があり、非常にエラーが発生しやすく、保守が困難です。
同期モードでの非同期書き込みは次のようになります:
現時点では、非同期ビジネス ロジックは通常の同期を通じて実装されます。
同期的な方法で非同期的に書くことは、コードの編成形式を指します。 async/await を使用すると、同期的な方法で非同期に書き込むことができます。次のコードを参照してください。 リーリー
; async/await を使用した後も、コードは同期的に見えますが、内部では最初に非同期操作 f が実行され、次に tf是一个异步操作,如果不使用async/await,直接同步的方式打印t,结果肯定是undefinedが出力されます。
f
undefined
上記の 2 つの答えで十分です
非同期呼び出しは現在のスレッドに対して非ブロックであるため、非同期処理が完了したかどうか、またはエラーが発生したかどうかを知りたい場合は、通常、Node.js で一般的なイベントまたはコールバックを通じて実現されます。 Ajax は非常に典型的な非同期呼び出しであり、jQuery.ajax を例に挙げます
リーリーjQuery の Ajax は jQuery の Promise オブジェクトを返します。通常、
done()
回调来处理调用完成之后的事情。但实际它也有标准 Promise 的then()
,所以上面的done
是可以改成then
的,但是要注意,done
是以事件的形式注册回调,它返回当前这个 Promise 对象本身,可以链式调用注册若干个回调。而then
を使用して別の Promise オブジェクトを返します (標準の Promise 仕様)。呼び出しが連鎖している場合、各呼び出しは同じ Promise オブジェクトに対して作用しません。コールバックで別の非同期呼び出しを行う必要がある場合は、コールバックに別のコールバックを登録する必要があります。たとえば、特定のデータを取得するには、まず api1 から特定の値を取得し、次にこの値を使用して api2 から特定のリソースを取得し、次にこのリソースの特定の値を使用して api3 からこの値を取得する必要があります。書くと次のようになります:
リーリーこれはまだ 3 番目のレベルです...非常に恐ろしいフォームです。この形態を「コールバック地獄」と呼びます。
この問題を解決するために、誰もがさまざまな方法を考えてきました。Promise もその 1 つですが、Promise はまだこの形式を完全に取り除くことができません。 co ライブラリも解決策の 1 つですが、完全に排除することはできません。
ただし、ES2017ではasync/awaitが導入され、いわゆる同期形式での非同期書き込みが可能になりました。例えば、上記のコードは
のように書き換えることができます。 リーリーasync/await はコールバックを排除するため、非同期 (つまり同期) コードを作成するのと同じように見えます。
参考:
非同期呼び出しの「フラット化」について話します
地獄から天国へ、ノードのコールバックが async/await に変更されます
JavaScript の async/await を理解する
非同期の場合、次の形式でコールバック関数をネストするのが一般的です。
リーリーこの時点で、コールバックのネストが表示されますが、これは層ごとにネストする必要があり、非常にエラーが発生しやすく、保守が困難です。
同期モードでの非同期書き込みは次のようになります:
リーリー現時点では、非同期ビジネス ロジックは通常の同期を通じて実装されます。
同期的な方法で非同期的に書くことは、コードの編成形式を指します。 async/await を使用すると、同期的な方法で非同期に書き込むことができます。次のコードを参照してください。 リーリー
; async/await を使用した後も、コードは同期的に見えますが、内部では最初に非同期操作 f が実行され、次に t
f
是一个异步操作,如果不使用async/await,直接同步的方式打印t,结果肯定是undefined
が出力されます。上記の 2 つの答えで十分です