My Promise 进入两者然后赶上

My Promise going into both then and catch

我有一组嵌套的承诺,如下所示。此处的预期行为是打印 1,然后打印 2,然后在 dropbox_functions.moveFolder('test', data.ui) 下调用回调。然而,发生的事情是先打印 1,然后打印 2,再打印 2.1,因此 2 promise 进入 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)
        });

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

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

这不是答案,而是建议。 promises 的全部意义在于您不必嵌套它们,但可以 chain 它们代替。这是通过简单地 return 将新承诺作为提供给 then 的函数的 return 值来完成的。然后,您可以在处理新解析的承诺后链接另一个 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 and/or description 属性或通过调用 toString() 将其转换为字符串在上面。


此外,通过自己调用回调函数,您仍然将 callback hell 引入到您的程序中。我建议 returning 一个承诺并使用它。如果上面的代码是您函数的最后一条语句,您可以简单地 return 来自最后一条 then 语句的已解决承诺。

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

如果它不是最后一条语句,只需将生成的承诺保存到一个变量中,然后 return 在您执行其他操作之后。如果您所做的只是将 catch 语句转发到 Promise.reject(...),您甚至可以省略它(目前情况并非如此,因为您也添加了 data)。这可以通过调用 yourFunction.

的代码来处理