我有一组嵌套的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)
});
答案 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 的代码进行处理。