如何使用Q.js正确链接条件(?)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,并解决它。然后在该条件部分完成解析后,调用第二个提示,然后解析其中的所有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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何按顺序使用angularjs $ q链接promise?

来自分类Dev

如何在ExpressJS中使用Q Promise?

来自分类Dev

如何使用Java中的Q顺序运行Promise?

来自分类Dev

如何使用Q.Promise <string>作为字符串?

来自分类Dev

如何使用Q.Promise <string>作为字符串?

来自分类Dev

在Node.js中使用Q.js Promise进行循环的正确方法

来自分类Dev

如何正确链接Java中的OR和AND条件?

来自分类Dev

如何在node.js中实际使用Q promise?

来自分类Dev

Q和Promise链接

来自分类Dev

如何在node.js中用Q promise重写一系列条件语句?

来自分类Dev

链接JavaScript Promise时,如何处理then()函数中的条件?

来自分类Dev

js:使用可选链接的正确方法?

来自分类Dev

使用Q / Promise与回调

来自分类Dev

Q.all()如何与复杂的Promise数组一起使用?

来自分类Dev

如何将节点sqlite3与q一起使用(Promise)

来自分类Dev

将Node异步功能转换为Promise时如何使用Q库?

来自分类Dev

如何使用Q将事件侦听器转换为Promise

来自分类Dev

如何将节点sqlite3与q一起使用(Promise)

来自分类Dev

Q Promise Node.js如何循环解析

来自分类Dev

使用Q Promises在node.js中链接GET请求

来自分类Dev

在node.js中使用q时如何删除样板代码

来自分类Dev

如何使用$ q保证与angular js中的多个(循环)异步api调用并行工作?

来自分类Dev

我如何在Node.js中将Q-lib与Restify一起使用

来自分类Dev

我如何在Node.js中将Q-lib与Restify一起使用

来自分类Dev

如何使用条件禁用 <a> 链接?

来自分类Dev

如何从Q Node Promise返回变量?

来自分类Dev

实习生JS-如何在链接的Command方法中使用Promise.all()?

来自分类Dev

如何正确使用bash条件

来自分类Dev

q诺言如何使用?

Related 相关文章

热门标签

归档