私はまだ promise を完全に理解していないので、これが単純な誤解である場合は申し訳ありません。
ページ上のアイテムを削除する機能がありますが、ページの状態に応じて特定の動作があります。疑似コード的には、次のようなものです。
Does the page have changes?
If yes - prompt to save changes first
If yes - save changes
If no - exit function
If no - continue
Prompt to confirm delete
If yes - delete item and reload data
If no - exit function
うまくいけば、それは理にかなっています。基本的に、変更がある場合は、最初にデータを保存する必要があります。次に、データが保存されている場合、または最初から変更がなかった場合は、ユーザーに削除の確認を求めます。問題は、デュランダルとブリーズを使用していて、それらが一緒に返すプロミスを正しくチェーンできないように見えることです。
私の関数は現在このように見えますが、これは間違っていることはわかっていますが、どこを修正すればよいか悩んでいます。
if (this.hasChanges()) {
app.showMessage('Changes must be saved before removing external accounts. Would you like to save your changes now?', 'Unsaved Changes...', ['Yes', 'No'])
.then(function (selectedOption) {
if (selectedOption === 'Yes') {
return this.save();
} else {
Q.resolve()
}
});
}
app.showMessage('Are you sure you want to delete this item?', 'Delete?', ['Yes', 'No'])
.then(function (selectedOption) {
if (selectedOption === 'Yes') {
item.entityAspect.setDeleted();
datacontext.saveChanges()
.then(function () {
logger.logNotificationInfo('Item deleted.', '', router.activeInstruction().config.moduleId);
Q.resolve(this.refresh(true));
}.bind(this));
}
}.bind(this));
durandal からの app.showMessage 呼び出しが promise を返し、次に this.save が promise を返し、最後に this.refresh も promise を返します。
したがって、hasChanges を確認し、必要に応じて save を呼び出して解決する必要があると思います。次に、その条件セクションの解決が完了したら、2 番目のプロンプトを呼び出し、その中のすべての promise を解決します。
申し訳ありませんが、これは非常に明確ではないと思いますが、それは、ここでチェーンを完全にフォローしていないという事実から来ていると思います.
どんな助けでも大歓迎です!ありがとう。