My Promise 进入两者然后赶上
My Promise going into both then and catch
我有一组嵌套的承诺,如下所示。此处的预期行为是打印 1,然后打印 2,然后在 dropbox_functions.moveFolder('test', data.ui)
下调用回调。然而,发生的事情是先打印 1,然后打印 2,再打印 2.1,因此 2 promise 进入 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)
});
在执行第 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.
的代码来处理
我有一组嵌套的承诺,如下所示。此处的预期行为是打印 1,然后打印 2,然后在 dropbox_functions.moveFolder('test', data.ui)
下调用回调。然而,发生的事情是先打印 1,然后打印 2,再打印 2.1,因此 2 promise 进入 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)
});
在执行第 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.