我有一套嵌套的承诺如下所示。这里的预期行为是打印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)
});
发布于 2018-12-05 10:45:36
行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)
});
发布于 2018-12-05 11:25:38
这不是一个答案,而是一个建议。承诺的全部意义在于,您不必嵌套它们,而是可以链条它们。这是通过简单地返回一个新的允诺作为函数的返回值来实现的。然后,您可以在它之后链接另一个语句,该语句处理新解决的承诺。
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()
将其转换为字符串。
此外,通过自己调用回调函数,您仍然可以在程序中引入回调地狱。我建议你回一个承诺,然后处理这个问题。如果上面的代码是函数的最后一条语句,您可以简单地从最后一条语句返回一个已解决的承诺。
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的代码来处理这个问题。
https://stackoverflow.com/questions/53638697
复制