【发布时间】:2019-05-07 09:36:03
【问题描述】:
我有一组嵌套的 Promise,如下所示。这里的预期行为是打印 1,然后打印 2,然后在 dropbox_functions.moveFolder('test', data.ui) 下调用回调。然而发生的事情是 1 被打印然后 2 被打印并且 2.1 被打印,所以 2 承诺进入then 和catch。我不知道为什么。
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)
});
【问题讨论】:
-
你为什么要嵌套你的承诺?这就是避免回调地狱的承诺的全部意义
-
这意味着
dropbox_functions.moveFolder('test', data.ui)产生了异常。与其使用console.log('2.1'),不如使用console.log('2.1', error),这样您就知道异常是什么了。 -
您可以创建不同的 Promise 并调用 then 来解决每个 Promise 并使用 1 个 catch 来解决错误。这确实会导致不知道错误发生在哪里的问题,但在这种情况下,您可以切换到 async/await
-
dropbox_functions.moveFolder是您出错的原因。要么功能不可用,要么data.ui不可用 -
您设置其中一个捕获的方式充当了通过。所以它捕捉到一个错误,然后继续解决
标签: javascript node.js dropbox