約束はかなり混乱しています。同期ですか、非同期ですか?
return new Promise (function(resolved,reject){
//sync or async?
});
渡す関数into Promiseコンストラクターは同期的に実行されますが、その解像度に依存するものはすべて非同期的に呼び出されます。 promiseがすぐに解決されたとしても、ハンドラーは非同期で実行されます(setTimeout(fn, 0)
の場合と同様)。メインスレッドが最初に最後まで実行されます。
これは、JavaScript環境に関係なく、Nodeまたはブラウザのどちらにいても同じです。
console.log('start');
const myProm = new Promise(function(resolve, reject) {
console.log('running');
resolve();
});
myProm.then(() => console.log('resolved'));
console.log('end of main block');
プロミスはそれ自体が正確に同期または非同期ではありません。 promiseを作成すると、それに渡すコールバックがすぐに実行され、その関数が生成されるまで他のコードは実行できません。次の例について考えてみます。
_new Promise(function(resolve, reject) {
console.log('foo');
})
console.log('bar');
_
Promiseの外のコードは、promise(同期)内のコードが実行を開始する前に完了するのを待つ必要があります。
とはいえ、promiseは非同期コードを処理する一般的な方法です。 promiseの最も一般的な使用例は、非同期で生成またはフェッチされる値を表すことです。その値に依存するロジックは、.then()
または関連するPromiseメソッドにコールバックを登録することにより、値が利用可能になるまで非同期に待機できます。
プロミスはJavascriptの通常のクラスに似ています。独自のPromise実装を作成しているとすると、promiseクラスはおおよそ次のようになります。 _resolve and reject
_をパラメーターとして渡してすぐに呼び出すメソッドが渡されることを期待しているコンストラクターに注意してください。
_class Promise {
constructor(method) {
method(resolve, reject)
}
resolve() { ... }
reject() { ... }
then() { ... }
}
_
したがって、new Promise()
を実行すると、新しいオブジェクトが作成されるだけです。 _Promise constructor
_が実行され、すぐにメソッドが呼び出されます。そのため、promise内のコードは同期的に実行されます。
_return new Promise (function(resolved,reject){
//sync or async?
});
_
関数内で、本質的に非同期である別の関数を呼び出している場合、その別の関数は非同期で実行されます。それ以外の場合は、他のすべてが同期で実行されます。
then
を使用してプロミスにチェーンがあった場合、最初のプロミスがresolve()
を呼び出した後にのみ、チェーンが呼び出されます。
_return new Promise (function(resolve,reject){
const a = 5*5; // sync operation.
db.save(a, function callback() { // async operation.
resolve() // tells promise to execute `then` block.
});
});
_
Promiseを作成してそれにコールバックを渡すと、そのコールバックはすぐに実行されます(同期)
const promise= new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
console.log("result");
})
console.log("global log")
しかし、.then()メソッドでそれを解決すると、非同期の方法で動作するため、たとえば次のようになります。
const promise = new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
resolve("fullfiled")
})
promise.then(v => {
console.log(v)
})
console.log("global log")