首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我的承诺既能实现又能抓住

我的承诺既能实现又能抓住
EN

Stack Overflow用户
提问于 2018-12-05 10:36:05
回答 2查看 1.4K关注 0票数 0

我有一套嵌套的承诺如下所示。这里的预期行为是打印1,然后打印2,然后在dropbox_functions.moveFolder('test', data.ui)下调用回调。然而,正在发生的事情是,1被打印,然后2被打印,2.1被打印出来,所以2的承诺进入了thencatch。我想不出为什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dropbox_functions.createBatchFolder(data.ui)
        .then(function(response) {
          console.log('1')
          console.log(response)
          dropbox_functions.checkScannerFolderExists('test')  
            .then(function(response) {
              console.log('2')
              console.log(response)
              dropbox_functions.moveFolder('test', data.ui)
                .then(function(response) {
                  console.log(response)
                  callback(null, data)
                })
                .catch(function(error) {
                  console.log(error);
                  callback('Data not copied from scanner', data)
                });
            })
            .catch(function(error) {
                console.log('2.1')
                console.log(response)
                dropbox_functions.createDataFolder(data.ui)
                  .then(function(response) {                      
                    console.log(response)
                    callback('No scanned folder', data)
                  })
                  .catch(function(error) {
                    console.log(error);
                    callback('Data Folder not created', data)
                  });  
            });
            // callback(null, data)
        })
        .catch(function(error) {
          console.log('1.2')
          console.log(error)
          callback('Folder not created', data)
        });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-05 10:45:36

console.log('2')执行后,必须引发错误。如果在承诺执行过程中抛出错误,下一个立即捕获块将捕获特定错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
              console.log('2')
              console.log(response) <-- Here 
              dropbox_functions.moveFolder('test', data.ui) <--- Here 
                .then(function(response) {
                  console.log(response)
                  callback(null, data)
                })
                .catch(function(error) { <-- or here
                  console.log(error);
                  callback('Data not copied from scanner', data)
                });
票数 2
EN

Stack Overflow用户

发布于 2018-12-05 11:25:38

这不是一个答案,而是一个建议。承诺的全部意义在于,您不必嵌套它们,而是可以链条它们。这是通过简单地返回一个新的允诺作为函数的返回值来实现的。然后,您可以在它之后链接另一个语句,该语句处理新解决的承诺。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dropbox_functions
  .createBatchFolder(data.ui)
  .then(function (response) { // response of createBatchFolder 
    console.log('1');
    console.log(response);
    return dropbox_functions.checkScannerFolderExists('test');
  })
  .then(function (response) { // response of checkScannerFolderExists
    console.log('2');
    console.log(response);
    return dropbox_functions.moveFolder('test', data.ui);
  })
  .then(function (response) { // response of moveFolder
    console.log(response);
    callback(null, data);
  })
  .catch(function (error) { // some error occurred
    console.error(error);
    callback(error, data);
  });

如果您需要对特定的错误做一些事情,您可以检查错误的name和/或description属性,或者通过在错误上调用toString()将其转换为字符串。

此外,通过自己调用回调函数,您仍然可以在程序中引入回调地狱。我建议你回一个承诺,然后处理这个问题。如果上面的代码是函数的最后一条语句,您可以简单地从最后一条语句返回一个已解决的承诺。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function yourFunction() {
  // ...
  return dropbox_functions
    .createBatchFolder(data.ui)
    // ...
    .then(function (response) { // response of moveFolder
      console.log(response);
      return Promise.resolve([null, data]);
    })
    .catch(function (error) { // some error occurred
      console.error(error);
      return Promise.reject([error, data]);
    });
}

如果这不是最后一条语句,只需将得到的承诺保存到变量中,并在完成其他操作后返回。如果只将catch语句转发到Promise.reject(...)中,甚至可以省略catch语句(目前情况并非如此,因为您也添加了data )。然后,可以通过调用yourFunction的代码来处理这个问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53638697

复制
相关文章
Android Source Generator错误:无法找到基本名称xxx的包
File > Project Structure > facets > 添加Android-Gradle > 关闭并重新打开项目并重建.
可定
2020/04/20
8470
[1207]ImportError:无法导入名称“ RandomizedLogisticRegression”
ImportError:无法导入名称“ RandomizedLogisticRegression”
周小董
2023/10/10
4240
Netty在Dubbo中的线程名称
在项目中,我们会使用RocketMQ和Dubbo.前者用于发送或消费消息,后者用于两个模块之间的接口调用.
书唐瑞
2022/06/02
1.3K0
Netty在Dubbo中的线程名称
python包urllib名称
经查询,在python3.5版本中是使用urllib.request,而在python2.7中则是urllib2
努力在北京混出人样
2019/02/18
9850
破解在idea中无法加载spring cloud config中多环境配置之谜
1、config 默认Git加载 通过spring.cloud.config.server.git.uri指定配置信息存储的git地址,比如:https://github.com/xxx/config-repo
算法之名
2019/08/20
2.3K0
破解在idea中无法加载spring cloud config中多环境配置之谜
[1207]ImportError:无法导入名称“ RandomizedLogisticRegression”
ImportError:无法导入名称“ RandomizedLogisticRegression”
周小董
2023/10/10
4060
PHP中Redis扩展无法加载问题
phpredis编译出来的redis.so也需要拷贝到"/usr/lib64/php/modules/"中;
叫我可儿呀
2019/11/16
2K0
Idea 中图片资源无法加载问题
今天在看一个 Java 的小游戏时,遇到项目图片资源无法加载的问题,运行显示界面如图
攻城狮杰森
2022/06/03
2.9K0
Idea 中图片资源无法加载问题
springboot测试中主程序中能加载bean测试中无法加载bean
如遇到springboot版本的问题导致bean类无法注入到项目中,可能是注解和springboot版本不匹配导致启动类启动时扫描不到相应的bean类
一个风轻云淡
2022/11/13
1.8K0
springboot测试中主程序中能加载bean测试中无法加载bean
无法在R里面加载相应版本的python
reticulate可以实现R与python的相互切换,即在R里面调用python的脚本、模块等。
生信编程日常
2020/11/24
2.4K0
在Intellij IDEA中修改模板中user变量名称
默认IDEA取的是当前系统的用户名作为这个变量的,但是如果系统的用户名不是你期望的用户名,那么修改系统的用户名在IDEA中也还是使用的是旧的用户名。
前Thoughtworks-杨焱
2021/12/08
3.6K0
java中无法解析为类型_java无法解析导入的包
.odt文件是openoffice软件产生的文档格式,可以直接用office打开,这其实就是一个压缩包,可以使用解压软件打开,里面有一个content.xml文件,这个文件内有<text:p>标签,标签内就是展示出来的内容。
全栈程序员站长
2022/10/28
4.8K0
java:加载jar包中的动态库
java中System.load(String)方法可以加载一个动态库,有时为了便于管理和发行,我们会把动态库打包jar包一起发行。这时如何加载jar包中的动态库呢? 原理也很简单,就是先把动态库解
10km
2019/05/25
3.9K0
Gravatar 头像无法加载
由于众所周知的原因,头像服务器多数都无法正常访问,不管是http还是https。为了解决头像问题有两个办法:
obaby
2023/02/22
1.5K0
制作动态framework与静态framework的那些坑
今天我们来看看制作framework---dynamic和static这两中库需要注意的
大话swift
2020/05/08
2.1K0
制作动态framework与静态framework的那些坑
面试题:unittest加载测试用例名称必须以test开头,是否可以定制化
前几天,在一个群里,一个人问了,这样一个问题。说他面试遇到一个面试官,问他,为啥unittest的测试用例要用test 开头,能不能定制化。他不知道为啥。
雷子
2021/03/15
1.3K0
面试题:unittest加载测试用例名称必须以test开头,是否可以定制化
Excel小技巧58: 在公式中快速应用名称
在Excel中,名称是一个非常好的功能,不仅能够简化公式,而且让公式的可读性更好。本文介绍一个小技巧,可以让定义的名称快速应用到公式中。对于使用单元格引用的公式,这是一个非常好应用名称的方法。
fanjy
2020/09/27
1.1K0
Excel小技巧58: 在公式中快速应用名称
问题idea maven无法加载导入子模块的依赖包的解决
还有个问题,如果使用自己下载的maven版本,会出现无法导入maven工程的错误;提示如下
JQ实验室
2022/06/09
2.8K0
在启动jar包时,发现内存不足无法启动
发现有一command为abrt-hook-ccpp的进程占用较多CPU和内存资源,如上图所示,abrt是AUTOMATIC BUG REPORTING TOOL的缩写。 解决方案 为了解决该问题,可以关闭abrt-hook-ccpp,具体操作如下:
高大北
2022/06/14
2.7K0
在启动jar包时,发现内存不足无法启动
点击加载更多

相似问题

将每个函数应用于列表Haskell的每个元素

24

如何在Haskell中将函数应用于列表中的每个元素?

119

应用于Haskell中嵌套列表的类似函数

12

将函数应用于Haskell中的元素列表

12

如何将高阶函数应用于Haskell中的有效函数?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文