Promise 数据和异常处理
Promise data and exception handling
我对 promise 的使用感到困惑,特别是它的数据操作方式(将值从一个块传递到另一个块)和异常处理(冒泡错误)。我正在尝试学习使用 promise 和处理错误的正确方法,例如
Error: A caught error.
at promiseTwo()
at promiseOne()
at subprocess()
at mainprocess()
以下是我实现它们的两次尝试:
尝试 1:笨拙,嵌套很深,错误未被发现。
var subprocess = () => {
return new Promise((resolve, reject) => {
promiseOne().then(data1 => {
// Some code with data1, throw some error
promiseTwo().then(data2 => {
// Some code with data1n2, throw some error
promiseThree().then(data3 => {
// Data manipulation with data1, data2, and data3
return resolve(<...>)
}).catch(err3 => { throw err3 })
}.catch(err2n3 => { throw err2n3 }) // >>> ERR: Cannot get err3.
}.catch(err1n2n3 => { return reject(err1n2n3) }) // >>> ERR: Cannot get err3 or err2.
}
}
return new Promise((resolve, reject) => {
subprocess().then(data => {
// TODO
}).catch(allErr => { return reject(allErr) }
}
尝试 2:无法使用来自先前承诺块的数据。
var subprocess = () => {
return new Promise((resolve, reject) => {
promiseOne()
.then(data1 => {
// Some code with data1, throw some error
return promiseTwo()
})
.then(data2 => {
// Some code with data1n2, throw some error
// >>> ERR: Cannot get data1
return promiseThree()
})
.then(data3 => {
// Data manipulation with data1, data2, and data3
// >>> ERR: Cannot get data1 and data2
return resolve(<...>)
})
.catch(err1n2n3 => {
return reject(err1n2n3)
})
}
}
return new Promise((resolve, reject) => {
subprocess().then(data => {
// Some code, throw some error
}).catch(allErr => { return reject(allErr) }
}
注意: 一些 promise 块(即 promiseOne
、promiseTwo
等)是预定义的,所以我无法控制他们会 return 什么数据。我确信尝试中有更多错误(例如,如果 return
使用函数是正确的方法)。
请帮忙。谢谢。
听起来你在寻找 Promise.all,它可以让你设置一系列的承诺,然后在它们全部解决后处理结果。
对于这种情况,可以结合使用promises和async-await。
从问题来看,似乎我们有三个 promise 和一个执行和处理它们的函数。
你可以试试这样的 -
const subProcess = () => {
return new Promise((resolve, reject) => {
// Using IIFE ( You shouldn't put async keyword on promise callbac )
(async () => {
// Use of try catch to handle the errors
try {
await promiseOne()
await promiseTwo()
await promiseThree()
// Additional code if need after them
} catch(err){
// Handle error ( all three promise error will be transferred here )
}
})()
})
}
上面的代码等待 promise 一个接一个地执行,如果有的话,也会从所有三个 promise 中捕获错误。
正如@samuei 提到的,您也可以在此使用 Promise.all()。
const subProcess = () => {
return new Promise((resolve, reject) => {
// Using IIFE ( You shouldn't put async keyword on promise callbac )
(async () => {
// Use of try catch to handle the errors
try {
const myPromises = [promiseOne, promiseTwo, promiseThree];
const res = await Promise.all(myPromises);
// Additional code if need after them
} catch(err){
// Handle error ( all three promise error will be transferred here )
}
})()
})
}
如果你不想使用 async-await 那么你也可以这样做
const subProcess = () => {
return new Promise((resolve, reject) => {
const myPromises = [];
const myPromises = [promiseOne, promiseTwo, promiseThree];
Promise.all(myPromises)
.then(res => {
// Handle the response
})
.catch(err => {
// Handle the error
})
})
}
我对 promise 的使用感到困惑,特别是它的数据操作方式(将值从一个块传递到另一个块)和异常处理(冒泡错误)。我正在尝试学习使用 promise 和处理错误的正确方法,例如
Error: A caught error.
at promiseTwo()
at promiseOne()
at subprocess()
at mainprocess()
以下是我实现它们的两次尝试:
尝试 1:笨拙,嵌套很深,错误未被发现。
var subprocess = () => {
return new Promise((resolve, reject) => {
promiseOne().then(data1 => {
// Some code with data1, throw some error
promiseTwo().then(data2 => {
// Some code with data1n2, throw some error
promiseThree().then(data3 => {
// Data manipulation with data1, data2, and data3
return resolve(<...>)
}).catch(err3 => { throw err3 })
}.catch(err2n3 => { throw err2n3 }) // >>> ERR: Cannot get err3.
}.catch(err1n2n3 => { return reject(err1n2n3) }) // >>> ERR: Cannot get err3 or err2.
}
}
return new Promise((resolve, reject) => {
subprocess().then(data => {
// TODO
}).catch(allErr => { return reject(allErr) }
}
尝试 2:无法使用来自先前承诺块的数据。
var subprocess = () => {
return new Promise((resolve, reject) => {
promiseOne()
.then(data1 => {
// Some code with data1, throw some error
return promiseTwo()
})
.then(data2 => {
// Some code with data1n2, throw some error
// >>> ERR: Cannot get data1
return promiseThree()
})
.then(data3 => {
// Data manipulation with data1, data2, and data3
// >>> ERR: Cannot get data1 and data2
return resolve(<...>)
})
.catch(err1n2n3 => {
return reject(err1n2n3)
})
}
}
return new Promise((resolve, reject) => {
subprocess().then(data => {
// Some code, throw some error
}).catch(allErr => { return reject(allErr) }
}
注意: 一些 promise 块(即 promiseOne
、promiseTwo
等)是预定义的,所以我无法控制他们会 return 什么数据。我确信尝试中有更多错误(例如,如果 return
使用函数是正确的方法)。
请帮忙。谢谢。
听起来你在寻找 Promise.all,它可以让你设置一系列的承诺,然后在它们全部解决后处理结果。
对于这种情况,可以结合使用promises和async-await。
从问题来看,似乎我们有三个 promise 和一个执行和处理它们的函数。
你可以试试这样的 -
const subProcess = () => {
return new Promise((resolve, reject) => {
// Using IIFE ( You shouldn't put async keyword on promise callbac )
(async () => {
// Use of try catch to handle the errors
try {
await promiseOne()
await promiseTwo()
await promiseThree()
// Additional code if need after them
} catch(err){
// Handle error ( all three promise error will be transferred here )
}
})()
})
}
上面的代码等待 promise 一个接一个地执行,如果有的话,也会从所有三个 promise 中捕获错误。
正如@samuei 提到的,您也可以在此使用 Promise.all()。
const subProcess = () => {
return new Promise((resolve, reject) => {
// Using IIFE ( You shouldn't put async keyword on promise callbac )
(async () => {
// Use of try catch to handle the errors
try {
const myPromises = [promiseOne, promiseTwo, promiseThree];
const res = await Promise.all(myPromises);
// Additional code if need after them
} catch(err){
// Handle error ( all three promise error will be transferred here )
}
})()
})
}
如果你不想使用 async-await 那么你也可以这样做
const subProcess = () => {
return new Promise((resolve, reject) => {
const myPromises = [];
const myPromises = [promiseOne, promiseTwo, promiseThree];
Promise.all(myPromises)
.then(res => {
// Handle the response
})
.catch(err => {
// Handle the error
})
})
}