AngularJS:链接承诺

2023-12-07

遵循以下建议AngularJS 验证和承诺,我想链接确认对话框,从而一次验证多个步骤。

根据用户提供的数据,调用API来查看哪些内容需要用户确认。 对于每一个需要确认的步骤,提示用户并让他们决定是否进入下一步。 如果任何步骤返回 false,则整个链都应返回 false。

我已经阅读了很多有关 async JS 和 Promise 的内容,但我必须承认我对它还很陌生。 如何正确链接这些以获得所有步骤的最终真/假?请注意,需要调用 API 来根据提供的信息确定需要向用户显示的所有内容,因此 fetchSomeData() 作为链中的第一个调用。

任何帮助或建议将不胜感激。

fetchSomeData = function() {
    var deferred = $q.defer();
    api.fetchData(param1, param2, param3)
        .then(function(data) {
        deferred.resolve(data.content);
    }, api.errorHandler);
    return deferred.promise;
}
// data = {condition1: false, condition2: true, condition3: true}
// display confirmation dialogs for step 2 and step 3, not step 1 

confirmStep1 = function(data) {
    if (data.condition1) {
        return confirmDialogService.popConfirm('step1').then(function(confirmed) {
            return confirmed;
        }, function() {
            return false;
        });
    } else {
        return $q.when(true);
    }
}

confirmStep2 = function(data) {
    if (data.condition2) {
        return confirmDialogService.popConfirm('step2').then(function(confirmed) {
            return confirmed;
        }, function() {
            return false;
        });
    } else {
        return $q.when(true);
    }
}

confirmStep3 = function(data) {
    if (data.condition3) {
        return confirmDialogService.popConfirm('step3').then(function(confirmed) {
            return confirmed;
        }, function() {
            return false;
        });
    } else {
        return $q.when(true);
    }
}

confirmSteps = function() {
    return fetchSomeData()
        .then(confirmStep1(data))
        .then(confirmStep2(data))
        .then(confirmStep3(data));
}

confirmSteps().then(function(allConfirmed) {
    if (allConfirmed == true) {
        doSomething();
    } else {
        return;
    }
});

dfsq 开始写一个答案,但删除了他的答案,因此在他的祝福下我添加了我的看法:

confirmSteps = function() {
    return fetchSomeData()
        .then(confirmStep1(data))
        .then(confirmStep2(data))
        .then(confirmStep3(data));
}

这调用了函数,它与setTimeout(alert("Hi"),5)你不想调用你想要链接它们的函数。喜欢setTimeout(function(){ alert("Hi"); }, 5);

confirmSteps = function() {
    return fetchSomeData()
        .then(confirmStep1)
        .then(confirmStep2)
        .then(confirmStep3);
}

不过,这样就过去了data仅适用于第一个承诺,并将上一个承诺的结果传递给下一个承诺,而不是您想要传递data对于这三者,您可以通过净一级来做到这一点:

confirmSteps = function() {
    return fetchSomeData().then(function(data){
        var v1, v2;
        return confirmStep1(data).then(function(d){ 
           v1 = d;
           return confirmStep2(data);
        }).then(function(d){
           v2 = d;
           return confirmStep3(data);
        }).then(function(v3){
            return v1 && v2 && v3;
        })
    });
};

这可行,但有点笨拙,您可以使用短路 - 有点像&&仅在左侧为 false 时才对其进行评估。此外,我们可以在一个中心位置进行所有错误处理。这会让你的代码看起来像。

confirmStep1 = function(data) {
    if (data.condition1) return $q.when(true);
    return confirmDialogService.popConfirm('step1');
};

confirmStep2 = function(data) {
    if (data.condition2) return $q.when(true);
    return confirmDialogService.popConfirm('step2');
};

confirmStep3 = function(data) {
    if (data.condition3) return $q.when(true);
    return confirmDialogService.popConfirm('step3'):
};

confirmSteps = function() {
    var data = fetchSomeData();
    return data.then(confirmStep1).then(function(soFar){ 
         if(!soFar) return false; 
         return data.then(confirmStep2); 
    }).then(function(soFar){ 
         if(!soFar) return false; 
         return data.then(confirmStep3); 
    }).catch(function(){ return false; });
};

作为额外提示:

fetchSomeData = function() {
    var deferred = $q.defer();
    api.fetchData(param1, param2, param3)
        .then(function(data) {
        deferred.resolve(data.content);
    }, api.errorHandler);
    return deferred.promise;
};

可以简单地变成:

fetchSomeData = function() {
    return api.fetchData(param1, param2, param3).then(function(data) {
        return data.content;
    }, api.errorHandler);
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS:链接承诺 的相关文章

随机推荐

  • 不使用TMS将TR文件推送到SAP ERP系统

    我是 salesforce com 开发人员 我需要构建一个简单的 SFDC SAP 集成场景以用于演示目的 我对 SAP 完全没有经验 但我们至少有一个 SAP 演示系统 我目前只能通过 SAP GUI 访问 现在 第三方集成解决方案提供
  • Internet Explorer 11 中的公钥加密

    我正在尝试使用 JavaScript 为 IE11 实现公钥加密 代码如下
  • 如何使用 RMarkdown 进行胶合包折叠?

    我一直在尝试使用glue和stargazer包来自动化乳胶中某些df表的结果 但我还没有任何结果 我想要的是 的含义出现在每个值旁边如表中所示 然后使用 RMarkdown 我想得到什么 我目前的丑陋且容易出错的修复 library dpl
  • 为子类强制执行特定方法签名?

    我想创建一个定义特定接口的类 然后要求所有子类都符合该接口 例如我想定义一个类 class Interface def init self arg1 pass def foo self bar pass 然后请放心 如果我持有任何元素a其中
  • Selenium 和并行化 JUnit - WebDriver 实例

    设置 所以 基本上我试图实现使用 JUnit 并行运行的 Selenium 测试 为此我找到了这个 JUnit 运行程序 它效果非常好 我非常喜欢它 但是 我遇到了有关 WebDriver 实例处理的问题 我想要的是 每个 WebDrive
  • 将并集类型转换为交集类型

    有没有办法将联合类型转换为交集类型 type FunctionUnion gt void p string gt void type FunctionIntersection gt void p string gt void 我想应用一个转
  • 在构造函数中调用纯虚函数会出现错误[重复]

    这个问题在这里已经有答案了 class a my base class public a foo virtual void foo 0 class b public a public void foo int main b obj ERRO
  • Safari 新日期,字符串值超出不同时间[重复]

    这个问题在这里已经有答案了 我想做的是将 yyyy mm dd HH mm ss 字符串更改为日期值 这是当前的代码 var c new Date 2019 01 19 23 59 59 replace s g T 它返回 铬合金 Sat
  • 查询时出错:EXECUTE 或 OPEN 语句中主变量的值对于其相应的使用来说太大

    关于尝试使用 select 查询语句 输入变量有 8 个字符 正如预期的那样 我不知道为什么选择查询会出现此错误 因为对于选择查询 它将查询 如果可用 它将返回 否则它将重新调整空白行 使用休眠 即使在映射时 它也只能正确映射为 8 这是我
  • 使用OpenCv在IOS中裁剪圆形图像

    我正在我的项目中开发面部特征检测 到目前为止 我已经开发出检测脸部 然后找到脸部内的眼睛 我想把眼睛剪成圆形 circle mask center radius cv Scalar 255 255 255 1 8 0 image copyT
  • SQL Server 2008 R2 中的空间会降低性能

    我遇到了一个相当奇怪的问题 我在 SQL Server 中创建了以下查询 SELECT FROM leads BatchDetails T1 INNER JOIN leads BatchHeader h ON T1 LeadBatchHea
  • 矩阵的成对偏相关,由一个变量控制

    我有一个 100 列的表 我想对其运行成对偏相关 使用第 100 列的变量进行控制pcor test函数从ppcor包裹 R 中是否有任何偏相关函数 我可以使用类似的返回值rcorr 取整个矩阵的成对相关性但仅由一个变量控制 听起来对于一个
  • 无法安装 mongoose npm

    我正在将 mongoose 安装为 npm 我返回了一堆错误 我做了一个 npm 安装npm install g 节点 gyp从我读到的有类似问题的帖子中 然而 我的问题似乎并没有消失 我无法解决此警告的问题 任何见解将不胜感激 lib k
  • java.lang.NoClassDefFoundError: org/apache/commons/exec/Executor

    我试图执行下面的代码 但在运行时出现错误 java lang NoClassDefFoundError org apache commons exec Executor 我也添加了 Common Exec jar 文件 但它不起作用 我需要
  • 目标文件“版本引用”从哪里来?

    目前我所在的目录中有一个文件libshared object so 为了通用而更改名称 当我跑步时 objdump p libshared object so 我收到以下输出 libshared object so file format
  • 读取系统调用表函数地址时内核模块崩溃

    我正在研究 rootkit 并尝试挂钩系统调用表 由于我已经可以从 boot System map uname r 动态检索表的地址 因此我跟踪了代码的有问题的部分并将其隔离到一个独立的 更简单的模块中 如下所示 它尝试检索并显示 Kill
  • 如何计算R中特定行的平均值?

    我有一个数据文件 如下例所示 但更大 names num Y1 Y2 William 1 4 71 7 4 William 2 3 75 8 William 3 4 71 7 9 Katja 1 5 83 8 5 Katja 2 5 17
  • VStack 中大 Text 和 TextField 之间的 SwiftUI 神秘间距

    我无法弄清楚为什么我的文本下方有一些空格 struct testView View State private var notes var body some View VStack Text Larg Text font system s
  • 为什么这个值是空的?

    我正在成功地制作 保存和检索我的共享偏好mainActivity 但我无法从我的服务中获取它 由于某种原因 当我尝试从后台服务检索它时 我的共享首选项为空 我在 onCreate 中初始化我的首选项 contactsPrefs getSha
  • AngularJS:链接承诺

    遵循以下建议AngularJS 验证和承诺 我想链接确认对话框 从而一次验证多个步骤 根据用户提供的数据 调用API来查看哪些内容需要用户确认 对于每一个需要确认的步骤 提示用户并让他们决定是否进入下一步 如果任何步骤返回 false 则整