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

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

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

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

代码语言:javascript
运行
复制
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 18:45:36

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

代码语言:javascript
运行
复制
              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 19:25:38

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

代码语言:javascript
运行
复制
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
运行
复制
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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档