Ada*_*dam 16 javascript breeze durandal q
如果这是一个简单的误解,我还没有完全理解承诺,所以道歉.
我有一个删除页面上的项目的功能,但我有一个特定的行为取决于页面的状态.Psuedo代码方式它是这样的:
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
Run Code Online (Sandbox Code Playgroud)
希望这是有道理的.基本上如果有变化,必须先保存数据.然后,如果数据已保存,或者如果没有开始更改,则提示用户确认删除.问题是我正在使用durandal和微风,我似乎无法将他们正确归还的承诺链接起来.
我的功能目前看起来像这样,我知道这是错误的,但我正在努力找出解决问题的方法.
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));
Run Code Online (Sandbox Code Playgroud)
来自durandal的app.showMessage调用返回一个promise,然后this.save返回一个promise,最后this.refresh也返回一个promise.
所以我想我需要检查hasChanges,然后在必要时调用save,然后解决它.然后在该条件部分完成解析后,调用第二个提示,然后解析其中的所有承诺.
对不起我不认为这是非常明确的,但我认为这也是因为我并没有完全遵循这里的链条.
任何帮助非常感谢!谢谢.
War*_*ard 11
克里斯是对的.您不需要任何Q.resolve调用.
顺便说一句,回复一个具有已解决价值的承诺true或false在您的情况下毫无意义.我担心你会错误地认为返回false会阻止链then()被叫.不是这样!具有值的false已解决的承诺仍然是一个很好的承诺...如以下代码中所示,它触发警报消息框:
Q(false) // same as Q.resolve(false)
.then(function () { alert('resolve(false) triggered then()') })
Run Code Online (Sandbox Code Playgroud)
如果您希望将promise置于失败状态(并且您不关心错误值),则应返回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));
}
}
Run Code Online (Sandbox Code Playgroud)
显然我还没有测试过这段代码.把它想象成灵感.
如果你在一个promise中抛出一个错误,那么这个进程将直接跳到第一个.fail/.catch处理程序,跳过它们.thens()之间的任何一个.
function AbortError() {}
MyClass.prototype.delete = function() {
var p = Q();
var self = this;
if( this.hasChanges() ) {
p = app.showMessage('...', '...', ['Yes', 'No'])
.then(function(answer){
if( answer === "Yes") {
return self.save(); //I assume save returns a promise
}
throw new AbortError();
});
}
return p
.then(function() {
return app.showMessage('...', '...', ['Yes', 'No'])
})
.then(function(answer) {
if( answer === "yes") {
item.entityAspect.setDeleted();
return datacontext.saveChanges();
}
throw new AbortError();
})
.then(function(){
logger.logNotificationInfo('Item deleted.', '', router.activeInstruction().config.moduleId);
self.refresh(true);
})
.fail(function(e){
//kris please provide typed .catch feature :(
if( !(e instanceof AbortError) ) {
throw e;
}
});
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13959 次 |
| 最近记录: |