私はJavaScriptのPromiseとPromiseチェーンについてあまり理解していません。例えば、以下のようなメソッドがあるとします。これはTypeScriptで書かれていますが、JavaScript ES6に合わせて変更することもできます。
private InsertPersonInDB(p : Person) {
return this.db.find({ //<- would this return?
selector: {objType: 'Person'},
fields: ['_id'],
sort: ['_id']
}).then( result => {
let allpersondIds : string[] = [];
(result.docs).forEach(rec => {
allpersondIds.push(rec._id);
});
return allpersondIds;
}).then ( allpersonIdsInDB => {
var id = this.getIdfromPersonName(person.personName, allpersonIdsInDB);
person._id = id;
return this.db.post(person) //<- or would this return?
}
}
//Calling function
for(let person of this.persons) {
InsertPersonInDB(person).then(result => {
console.log(result)
//Some UI updates
}).catch(err => {
console.log(err)
//Some UI updates notifying user about failure
});
}
ここでは2つのリターンがあります。1つ目は
this.db.findを返す
どれの探す機能は約束である
そしてthenチェーンの終わりは
this.db.post(person) を返します
平役職機能は約束です。
ここで3つの質問があります
1) この関数が実行されると何が返されますか?
2) 関数がすぐにPromiseを返す場合、チェーンはいつそれから実行する?
2) 階層化アプリケーションでプロミスチェーンをリファクタリングするためのより良いアプローチは何ですか。例:Fewチェーンそれからサービスで実行する必要があり、その他は UI で実行する必要がある場合、Promise コードをどのように構成すればよいですか?
ベストアンサー1
まず、自分で小さな例をいくつか作ってみれば、簡単に質問のテストができると思います。仕組みがよくわからないときは、小さな例を作って試してみて何が起こるか見てみるととても便利です。この質問でもそうしてみましょう(https://plnkr.co/edit/K18o4Lp2jtUincjyG5wi?p=preview動作バージョンについては、コンソールを開いて結果を確認してください!):
function test() {
return returnPromise().then((value) => {
console.log('1st then, inside test(): ' + value);
return 'Hello';
}).then((value) => {
console.log('2nd then, inside test(): ' + value);
return 'world';
});
}
function returnPromise() {
return new Promise(function(resolve, reject) {
resolve('start of new Promise');
});
}
test().then((value) => {
console.log('3rd then, after calling test: ' + value);
});
ご質問については:
- 連鎖したすべての関数と一緒に Promise を返します
then
。then
返された Promise に別の関数を追加すると、その関数は連鎖の最後に追加されます。 を実行しているときに表示されるのがこれですtest().then(...)
。 - Promise は、いつ実行されるかは示さず、ある時点で実行されることを伝えます。then チェーンは、Promise が解決されるたびに実行されます。詳細は で確認できます
returnPromise
。ここでは、新しい Promise を返します。Promise の本体は、resolve
完了すると (この場合は即時) メソッドを呼び出し、Promise をトリガーして、then
Promise にチェーンされているすべてのメソッドを解決して実行します。通常、Promise は即時に解決されず、最初に非同期タスク (サーバーからデータを取得するなど) を実行します。 - それは、アプリケーションの種類と、何を求めているかによって大きく異なります。責任が明確に定義されている限り、現在のアプローチ自体は悪くありません。