我是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");
}
})
});
}
答案 0 :(得分:2)
在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");
}
})
});
}
或者,您可以添加其他:
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");
}
}
})
});
}
答案 1 :(得分:1)
是的,您可以在承诺中使用任意数量的reject
。只是次品需要处于不同的流程。意味着一个接一个reject
接一个reject
的呼叫将无法正常工作。因为不会依次呼叫一个resolve
。
还要确保其他代码不会运行,最好在resolve
之前添加return
。
例如:
reject
答案 2 :(得分:0)
您应该尝试在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);
答案 3 :(得分:0)
使用很多拒绝是没有问题的,它完全取决于您的逻辑,并且是以这种方式使用的。
我唯一建议您更改的是Promise中的try / catch块,当您引发异常时,下一个promise.catch将处理它。
看看:
https://medium.com/datafire-io/es6-promises-patterns-and-anti-patterns-bbb21a5d0918