一个承诺中的两个拒绝
Two rejects in One Promise
我是 JavaScript 的新手。我不知道在哪里可以在一个承诺中使用两个拒绝;谁能告诉我在一个承诺中有两个拒绝是不好的做法?如果是,可选的解决方案是什么?
这是我的代码
async handler(ctx) {
/*
* sheet_to_json method converts excel file to JSON format
*/
let { s3Url, header } = ctx.params;
return new Promise((resolve, reject) => {
request({method: 'GET', uri: s3Url,encoding: null}, async function(err, res, data) {
if(err || res.statusCode !== 200) reject(err);
try{
const workbook = XLSX.read(data, {type:'buffer'});
const sheet_name_list = workbook.SheetNames;
let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
resolve(result);
}
catch(error){
reject("Invalid File Cointaint");
}
})
});
}
是的,您可以在承诺中使用任意数量的 reject
。只是拒绝需要不同的流程。意味着一个 reject
一个接一个地调用 reject
是行不通的。因为调用一个 resolve
一个接一个 resolve
不会。
还要确保其他代码不 运行 最好在 reject
.
之前添加一个 return
例如:
const checkIfRightPermission = new Promise((res, rej) =>{
//let's say we are doing an http request.
request.get('/getPermission?id=someid', function(err, res, body){
if(err){
//the request itself couldn't be completed SO
return rej();
}else{
if(sufficientPermission(body)){
}else{
//again
return rej()
}
}
})
});
您应该尝试将每个解决和拒绝都放在 if else 块中。
if (condition1) {
resolve(true);
} else if (condition2) {
reject(false);
} else {
reject(false);
}
例如,如果您要这样做:
if (condition1) {
resolve(true);
}
reject(false);
你应该改为:
if (condition1) {
resolve(true);
return;
}
reject(false);
您可以在 promise 回调中调用 reject(err)
的多个位置。只有第一个执行的才是重要的。对 reject()
的后续调用将被忽略,因为一旦设置了 Promise 状态,就无法通过进一步调用 reject()
或 resolve()
.
来更改它
通常好的做法是使用 return
结束您的函数执行或在您拒绝时使用 else
语句,因为继续做其他不会解决或拒绝的事情通常是无意义的,在某些情况下是有害的。
因此,在您的特定情况下,您可以像这样添加 return
:
async handler(ctx) {
/*
* sheet_to_json method converts excel file to JSON format
*/
let {s3Url,header} = ctx.params;
return new Promise((resolve, reject) => {
request({method: 'GET', uri: s3Url, encoding: null}, async function(err, res, data) {
if (err || res.statusCode !== 200) return reject(err); // <==== return added here
try {
const workbook = XLSX.read(data, {type: 'buffer'});
const sheet_name_list = workbook.SheetNames;
let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
resolve(result);
} catch (error) {
reject("Invalid File Cointaint");
}
})
});
}
或者,您可以添加一个 else:
async handler(ctx) {
/*
* sheet_to_json method converts excel file to JSON format
*/
let {s3Url, header} = ctx.params;
return new Promise((resolve, reject) => {
request({method: 'GET', uri: s3Url, encoding: null}, async function(err, res, data) {
if (err || res.statusCode !== 200) {
reject(err);
} else { // <======== else added here
try {
const workbook = XLSX.read(data, {type: 'buffer'});
const sheet_name_list = workbook.SheetNames;
let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
resolve(result);
} catch (error) {
reject("Invalid File Cointaint");
}
}
})
});
}
用很多次reject是没有问题的,完全看你的逻辑,就是为了这么用的。
我建议您唯一更改的是 Promise 中的 try/catch 块,当您抛出异常时,下一个 promise.catch 将处理它。
看一看:
https://medium.com/datafire-io/es6-promises-patterns-and-anti-patterns-bbb21a5d0918
我是 JavaScript 的新手。我不知道在哪里可以在一个承诺中使用两个拒绝;谁能告诉我在一个承诺中有两个拒绝是不好的做法?如果是,可选的解决方案是什么?
这是我的代码
async handler(ctx) {
/*
* sheet_to_json method converts excel file to JSON format
*/
let { s3Url, header } = ctx.params;
return new Promise((resolve, reject) => {
request({method: 'GET', uri: s3Url,encoding: null}, async function(err, res, data) {
if(err || res.statusCode !== 200) reject(err);
try{
const workbook = XLSX.read(data, {type:'buffer'});
const sheet_name_list = workbook.SheetNames;
let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
resolve(result);
}
catch(error){
reject("Invalid File Cointaint");
}
})
});
}
是的,您可以在承诺中使用任意数量的 reject
。只是拒绝需要不同的流程。意味着一个 reject
一个接一个地调用 reject
是行不通的。因为调用一个 resolve
一个接一个 resolve
不会。
还要确保其他代码不 运行 最好在 reject
.
return
例如:
const checkIfRightPermission = new Promise((res, rej) =>{
//let's say we are doing an http request.
request.get('/getPermission?id=someid', function(err, res, body){
if(err){
//the request itself couldn't be completed SO
return rej();
}else{
if(sufficientPermission(body)){
}else{
//again
return rej()
}
}
})
});
您应该尝试将每个解决和拒绝都放在 if else 块中。
if (condition1) {
resolve(true);
} else if (condition2) {
reject(false);
} else {
reject(false);
}
例如,如果您要这样做:
if (condition1) {
resolve(true);
}
reject(false);
你应该改为:
if (condition1) {
resolve(true);
return;
}
reject(false);
您可以在 promise 回调中调用 reject(err)
的多个位置。只有第一个执行的才是重要的。对 reject()
的后续调用将被忽略,因为一旦设置了 Promise 状态,就无法通过进一步调用 reject()
或 resolve()
.
通常好的做法是使用 return
结束您的函数执行或在您拒绝时使用 else
语句,因为继续做其他不会解决或拒绝的事情通常是无意义的,在某些情况下是有害的。
因此,在您的特定情况下,您可以像这样添加 return
:
async handler(ctx) {
/*
* sheet_to_json method converts excel file to JSON format
*/
let {s3Url,header} = ctx.params;
return new Promise((resolve, reject) => {
request({method: 'GET', uri: s3Url, encoding: null}, async function(err, res, data) {
if (err || res.statusCode !== 200) return reject(err); // <==== return added here
try {
const workbook = XLSX.read(data, {type: 'buffer'});
const sheet_name_list = workbook.SheetNames;
let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
resolve(result);
} catch (error) {
reject("Invalid File Cointaint");
}
})
});
}
或者,您可以添加一个 else:
async handler(ctx) {
/*
* sheet_to_json method converts excel file to JSON format
*/
let {s3Url, header} = ctx.params;
return new Promise((resolve, reject) => {
request({method: 'GET', uri: s3Url, encoding: null}, async function(err, res, data) {
if (err || res.statusCode !== 200) {
reject(err);
} else { // <======== else added here
try {
const workbook = XLSX.read(data, {type: 'buffer'});
const sheet_name_list = workbook.SheetNames;
let result = await XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]], {header});
resolve(result);
} catch (error) {
reject("Invalid File Cointaint");
}
}
})
});
}
用很多次reject是没有问题的,完全看你的逻辑,就是为了这么用的。
我建议您唯一更改的是 Promise 中的 try/catch 块,当您抛出异常时,下一个 promise.catch 将处理它。
看一看:
https://medium.com/datafire-io/es6-promises-patterns-and-anti-patterns-bbb21a5d0918