JavaScript 如何最好地在对象中实现 return 承诺?
How best way in JavaScript to do return promise in object?
在我的这部分代码中,试图识别它之前和已经 return 是 CPF 还是 CNPJ 是否有效,我需要 Validate () 函数的结果来return 到 {valid: true} 对象,但它只有 returns {valid : Promise {}},我尝试放置 async 和 await 但结果相同。 :-(
他不期待诺言。我尝试了 promise.resolve(Valid (number, type)),但 return 是 .
有什么建议吗?
function cpfcnpj (doc){
let valid = false,
number = doc.toString().replace(/\D/g, ''),
masked = false,
type = number.length === 11 ?
'CPF' : number.length === 14 ?
'CNPJ' : false
if (type === 'CPF') {
masked = number.replace(
/(\d{3})(\d{3})(\d{3})(\d{2})/,
"..-"
)
}
if (type === 'CNPJ') {
masked = number.replace(
/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/,
"../-"
)
}
function Valida(number, type)
valid = true;
let Soma = 0, Resto;
if (number == "00000000000") valid = false;
for (i = 1; i <= 9; i++) Soma = Soma + parseInt(number.substring(i - 1, i)) * (11 - i);
Resto = (Soma * 10) % 11;
if ((Resto == 10) || (Resto == 11)) Resto = 0;
if (Resto != parseInt(number.substring(9, 10))) valid = false;
Soma = 0;
for (i = 1; i <= 10; i++) Soma = Soma + parseInt(number.substring(i - 1, i)) * (12 - i);
Resto = (Soma * 10) % 11;
if ((Resto == 10) || (Resto == 11)) Resto = 0;
if (Resto != parseInt(number.substring(10, 11))) valid = false;
return valid
}
return {
type: type,
valid: Promise.resolve(Valida(number, type))
.then(valid => { return valid }),
number: number,
masked: masked
}
}
console.log(cpfcnpj('123.456.789-01'));
console.log(cpfcnpj('123 456 789@12'));
console.log(cpfcnpj('11.911.119/0001-9'));
console.log(cpfcnpj('11.9s11.1d19%0001&9'));
RETORNO:
{
type: 'CPF',
valid: Promise { <pending> },
number: '12345678901',
masked: '123.456.789-01'
}
{
type: 'CPF',
valid: Promise { <pending> },
number: '12345678912',
masked: '123.456.789-12'
}
{
type: false,
valid: Promise { <pending> },
number: '1191111900019',
masked: false
}
{
type: false,
valid: Promise { <pending> },
number: '1191111900019',
masked: false
}
这看起来像是过度设计出了问题。没有理由在这里使用 Promise
,因为没有发生异步操作。只需使用函数的结果设置 return 对象中的值:
return {
type: type,
valid: Valida(number, type),
number: number,
masked: masked
}
在我的这部分代码中,试图识别它之前和已经 return 是 CPF 还是 CNPJ 是否有效,我需要 Validate () 函数的结果来return 到 {valid: true} 对象,但它只有 returns {valid : Promise {}},我尝试放置 async 和 await 但结果相同。 :-(
他不期待诺言。我尝试了 promise.resolve(Valid (number, type)),但 return 是
有什么建议吗?
function cpfcnpj (doc){
let valid = false,
number = doc.toString().replace(/\D/g, ''),
masked = false,
type = number.length === 11 ?
'CPF' : number.length === 14 ?
'CNPJ' : false
if (type === 'CPF') {
masked = number.replace(
/(\d{3})(\d{3})(\d{3})(\d{2})/,
"..-"
)
}
if (type === 'CNPJ') {
masked = number.replace(
/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/,
"../-"
)
}
function Valida(number, type)
valid = true;
let Soma = 0, Resto;
if (number == "00000000000") valid = false;
for (i = 1; i <= 9; i++) Soma = Soma + parseInt(number.substring(i - 1, i)) * (11 - i);
Resto = (Soma * 10) % 11;
if ((Resto == 10) || (Resto == 11)) Resto = 0;
if (Resto != parseInt(number.substring(9, 10))) valid = false;
Soma = 0;
for (i = 1; i <= 10; i++) Soma = Soma + parseInt(number.substring(i - 1, i)) * (12 - i);
Resto = (Soma * 10) % 11;
if ((Resto == 10) || (Resto == 11)) Resto = 0;
if (Resto != parseInt(number.substring(10, 11))) valid = false;
return valid
}
return {
type: type,
valid: Promise.resolve(Valida(number, type))
.then(valid => { return valid }),
number: number,
masked: masked
}
}
console.log(cpfcnpj('123.456.789-01'));
console.log(cpfcnpj('123 456 789@12'));
console.log(cpfcnpj('11.911.119/0001-9'));
console.log(cpfcnpj('11.9s11.1d19%0001&9'));
RETORNO:
{
type: 'CPF',
valid: Promise { <pending> },
number: '12345678901',
masked: '123.456.789-01'
}
{
type: 'CPF',
valid: Promise { <pending> },
number: '12345678912',
masked: '123.456.789-12'
}
{
type: false,
valid: Promise { <pending> },
number: '1191111900019',
masked: false
}
{
type: false,
valid: Promise { <pending> },
number: '1191111900019',
masked: false
}
这看起来像是过度设计出了问题。没有理由在这里使用 Promise
,因为没有发生异步操作。只需使用函数的结果设置 return 对象中的值:
return {
type: type,
valid: Valida(number, type),
number: number,
masked: masked
}