如果这是一个简单的误解,我仍然对诺言不甚了解,因此深表歉意。
我具有删除页面上项目的功能,但是我有特定的行为,具体取决于页面的状态。伪代码明智的是这样的:
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,并解决它。然后在该条件部分完成解析后,调用第二个提示,然后解析其中的所有promise。
对不起,我认为这不是很清楚,但这也是因为我没有完全遵循这里的规定。
任何帮助,不胜感激!谢谢。
克里斯是正确的。您不需要任何Q.resolve调用。
顺便说一句,返回具有解决价值的承诺,true
或者false
在您的情况下毫无意义。我担心您会误以为返回false
会阻止链锁then()
被调用。不是这样!如值为false
触发警报消息框的以下代码所示,值为的已解决承诺仍然是一个好的承诺...
Q(false) // same as Q.resolve(false)
.then(function () { alert('resolve(false) triggered then()') })
如果要将承诺置于失败状态(并且不关心错误值),则应返回Q.reject()
。
我不知道this
您的代码中有什么内容,但是在执行内部功能时只会麻烦。将其捕获到变量中,这样您就不会迷失于补偿bind(this)
逻辑。
我不确定您要做什么。似乎有未保存的更改时,您不会继续删除项目。如果用户确定,则将保存未保存的更改。然后,您将要求用户确认删除。如果用户拒绝保存未决的更改,则您甚至不应开始删除过程。
如果我理解正确,我想你想要这样的东西:
var self = this; // WHAT IS THIS? I don't know but capture it as 'self'
function saveBeforeDeleting() {
return saveIfNeeded().then(deleteIfConfirmed);
}
function saveIfNeeded() {
// no need to save; return resolved promise
if (!self.hasChanges()) return Q();
var dialogPromise = app.showMessage(
'Changes must be saved before removing external accounts. '+
'Would you like to save your changes now?',
'Unsaved Changes...', ['Yes', 'No']
);
// When the user replies, either save or return a rejected promise
// (which stops the flow)
return dialogPromise.then(function (selectedOption) {
return (selectedOption === 'Yes') ? self.save() : Q.reject();
});
}
function deleteIfConfirmed() {
var dialogPromise = app.showMessage(
'Are you sure you want to delete this item?',
'Delete?',
['Yes', 'No']
);
return dialogPromise.then(function (selectedOption) {
return (selectedOption === 'Yes') ? deleteIt() : Q.reject();
});
function deleteIt() {
item.entityAspect.setDeleted();
return datacontext.saveChanges().then(logAndRefresh);
}
function logAndRefresh() {
logger.logNotificationInfo(
'Item deleted.',
'',
router.activeInstruction().config.moduleId
);
return self.refresh(true));
}
}
显然,我没有测试此代码。认为它是灵感。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句