承诺取消仍在触发履行功能

2024-03-14

这是我的代码:

var promiseResult =  new BBpromise(function(resolve, reject){
    console.log(1)
    // some actions
    setTimeout(function(){
        resolve();
    }, 2000);
}).cancellable().catch(BBpromise.CancellationError, function(e){
    console.log(e);
});

promiseResult.then(function(){
    console.log('AYYYY');
});
promiseResult.cancel(new BBpromise.CancellationError()).then(function(s){
    console.log('canceled ?');
});

我得到以下输出:

顺便说一句..输出似乎是立即的。看起来如果只是跳过这个决心。

1
{ [CancellationError: cancellation error] __stackCleaned__: true }
AYYYY
cancelled ?

它说..“stactCleaned:true”所以我想这意味着所有履行功能都已清理。但看来我错了

所以我的问题是:

  • 为什么当我调用 cancel() 时,如果承诺被取消,我会在输出中看到“AYYYY”。
  • What's exactly doing cancel in here? what is cancel actually doing in this case?
  • 有没有办法取消承诺内容的执行或承诺的传播?

为什么当我调用 cancel() 时,如果承诺被取消,我会在输出中看到“AYYYY”。

这是通常的行为.catch().

With catch(),您正在捕获取消错误,这会产生一个新的承诺,并用该值解决undefined(因为你没有从.catch()处理程序)。

所以你提供的功能then被称为就好了。

在这种情况下cancel实际上做了什么?

来自蓝鸟文档:

取消 Promise 会传播到仍处于待处理状态的目标 Promise 的最远可取消祖先,并以给定原因拒绝该 Promise(默认为取消错误)。

它沿着承诺链向上移动并拒绝您创建的第一个承诺(并且您将其标记为.cancellable()). .cancel()最多拒绝一个承诺,而不是整个链条。

有没有办法取消承诺内容的执行或承诺的传播?

您无法取消正在运行的代码的执行,传递给 Promise 构造函数的函数中的代码就是这种情况。

You can如果决议尚未传播到 Promise 链,则取消处理程序的执行。

您可以取消承诺的传播。你正是这样做的。但如果你catch取消然后将任何东西链接到上面catch,你重新开始承诺链。

也许这会有点启发:

var promiseResult =  new Promise(function(resolve, reject){
    console.log(1)
    setTimeout(function(){
        resolve("1");
    }, 2000);
}).cancellable().then(function () {
    console.log("this is never called");
    return 2;
}).catch(Promise.CancellationError, function(e){
    console.log(e);
    return 3;
});

promiseResult.then(function(d){
    console.log("got the value " + d);
    return 4;
});
promiseResult.cancel(new Promise.CancellationError()).then(function(s){
    console.log("and I got the value " + s);
    return 5;
});

输出是:

1
CancellationError: ...
got the value 3
and I got the value 3

正如你所看到的,原来的承诺被取消了,所以“这从未被调用”部分永远不会被调用。你有catch and then进一步恢复链条的调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

承诺取消仍在触发履行功能 的相关文章

随机推荐

  • CSS“反向边框半径”在元素的边界框之外创建手机凹口设计[重复]

    这个问题在这里已经有答案了 我正在尝试使用 HTML 和 CSS 创建看起来像手机的东西 并且我希望相机具有类似 倒置边框半径 的东西 可以将其与框架顺利连接 我不能只是将其放大并使用具有白色背景的伪元素掩盖不需要的区域 因为屏幕内容可能并
  • 如何生成 n 个相关项的二项式向量?

    我想根据多个相关项生成一个二项式向量 每个相关项都有一个定义的概率 当我使用 e G rbinom 1e3 size 4 prob c p x1 p x2 p x3 p x4 我得到类似的东西3 3 0 0 2 4 1 0 4 4 0 1
  • nginx 不提供更新的静态文件

    从apache切换到nginx 遇到了一些奇怪的事情 1 假设我网站的文档根目录中有一个 to txt 文件 其中包含 foo curl http localhost yo txt gt foo 2 然后我更改文件以包含 bar curl
  • 您使用什么来部署 Web 应用程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Visual Studio 2017加载崩溃解决方案

    我的 VS 2017 不断崩溃 并在 EventViewer 中出现以下错误 知道为什么会崩溃吗 Exception Info System InvalidOperationException at System Linq Enumerab
  • Test Flight Beta 测试:Xcode 6.3 Beta 4 未显示崩溃

    我正在关注新的试飞程序 我开发了一个应用程序 我通过 Xcode 提交到 iTunes Connect 门户 如果UIButton被点击 由于该应用程序可用于内部测试人员的 Beta 测试 因此我希望在新版本中看到崩溃日志CrashesXc
  • 如何将两个值合并/组合成同一数组中的单个键

    我不确定我的标题使用什么合适的术语 但只是想知道下面的解决方案需要将两个值合并 组合成一个关联数组中的一个 例如我有这个数组 Array 1 gt Array agent name 1 gt Agent 1 agent phone 1 gt
  • 使用 Xamarin 在可移植类库中安全地绑定 WCF

    我有一个 WCF 服务WSHttpBinding 不幸的是 在我的 PCL 中 由于某种原因我无法使用WSHttpBinding 我只能用BasicHttpBinding 有没有一种方法可以在可移植类库中使用安全绑定 我正在使用 Xamar
  • 如何从 Google 登录中检索年龄和性别

    我已将 Google 登录集成到我的 iOS 应用程序中 我想访问用户的性别和年龄 该文档不够清楚 无法了解如何执行此操作 我发现我应该请求正确的范围 我没有在文档中找到正式的范围列表 并且我不知道应该使用哪个范围 我也不知道当我得到数据时
  • 用于编辑 PROJECT-Info.plist 文件的 CFBundleVersion 字段的 Bash 脚本

    为了建立持续集成系统 Hudson 我编写了一个 bash 脚本来自动构建 Xcode 项目 此外 在调试配置中 要求我将项目的 svn 修订号插入 PROJECT Info plist 文件的 CFBundleRevision 字段中 作
  • 在 Linq-to-SQL 中模拟多表继承

    到目前为止 每个人都知道 Linq to SQL 本身并不支持多表继承 也称为每个子类型一个表 如果您想要本机支持 您可以使用其他 ORM 框架 例如 Entity Framework NHibernate 等 支持多表继承 参考SO问题
  • 有没有办法提高大文件解析日期的速度? [复制]

    这个问题在这里已经有答案了 我正在读取一个大约有 1B 行的大 csv 文件 我在解析日期时遇到了问题 Python 的处理速度很慢 文件中的一行如下所示 20170427 20 52 01 510 ABC USD MXN 1 OFFER
  • 更改不同屏幕上的列顺序

    基本上我想使用 bootstrap 实现的目标是这样的 https ibb co mBB9P6P https ibb co mBB9P6P 当它调整到较小的屏幕时 它应该喜欢 https ibb co 0XnDy2S https ibb c
  • SQL 中的 GROUP BY 和 HAVING

    如果我写 SELECT continent FROM world GROUP BY continent HAVING sum population gt 100000000 它将返回总金额超过 1 亿的所有大陆 但如果我像这样省略 GROU
  • DSN 无连接(MS Access to SQL 2016)

    当我想将链接表转换为 DSNLess 连接时 我有一个有效的解决方案 http www accessmvp com DJSteele DSNLessLinks html http www accessmvp com DJSteele DSN
  • 检查字符串是否为 JSON 格式

    如何检查给定的字符串是否是由空格 换行符分隔的多个 json 字符串的形式 例如 given test 123 Name mike 3个json用空格连接 返回 true 因为每个项目 test 123 and Name mike 是一个有
  • 使用设备宽度和初始比例 = 1 的视口标签,iPhone 中可以有超过 320 像素的内容吗?

    我正在开发一个网站 我希望让通过手机 平板电脑和台式电脑访问该网站的用户感到 快乐 我正在使用 jQuery Mobile 由于某种原因 jQuery 移动requires带有 width device width initial scal
  • 为什么 [\n$] 不起作用,而 (\n|$) 起作用?

    我们有这个字符串 末尾没有换行 The quick brown fox jumps over the lazy dog 我想匹配整个字符串直到新行 n or end occurs 我首先尝试 n 没用 然后我尝试了 n 做了工作 问题 为什
  • 没有名为 sql_server.pyodbc.base 的模块

    我想使用 SQL Server 作为 Django 的后端 但是在调试 Web 项目时得到了这个 sql server pyodbc 不是可用的数据库后端 错误是 没有名为 sql server pyodbc base 的模块 Python
  • 承诺取消仍在触发履行功能

    这是我的代码 var promiseResult new BBpromise function resolve reject console log 1 some actions setTimeout function resolve 20