我的承诺然后进入并抓住

时间:2018-12-05 18:36:06

标签: javascript node.js dropbox

我有一组嵌套的promise,如下所示。此处的预期行为是先打印1,再打印2,然后在dropbox_functions.moveFolder('test', data.ui)下调用回调。但是,发生的情况是先打印了1,然后打印了2,再打印了2.1,所以2许诺将进入thencatch中。我不知道为什么。

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)
        });

2 个答案:

答案 0 :(得分:2)

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

              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)
                });

答案 1 :(得分:1)

这不是答案,而是建议。承诺的全部重点是您不必嵌套它们,而可以chain嵌套它们。这可以通过简单地返回一个新的Promise作为提供给 then 的函数的返回值来完成。然后,您可以在处理新解析的诺言之后的另一个 then 语句中链接它。

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()将其转换为字符串。< / p>


此外,通过自己调用回调函数,您仍将callback hell引入程序中。我建议改为返回一个承诺,并与之合作。如果上面的代码是函数的最后一个语句,则只需从最后一个 then 语句返回一个已解决的promise。

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]);
    });
}

如果不是最后一条语句,只需将产生的promise保存到变量中,然后在执行其他操作后将其返回。如果您所做的全部只是将其转发到Promise.reject(...)中,您甚至可以省去 catch 语句(由于添加了data,当前情况并非如此)。然后可以通过调用 yourFunction 的代码进行处理。