ES6 从另一个函数回调内部退出函数



这是函数:

function addUser(request) {
return new Promise((res, rej) => {
ValidateFormData(request, CREATE_USER, (err) => {if(err) return rej(makeError(err)) });
console.log('creating user');
res();
})

}

当回调包含ValidateFormDataerr时如何停止函数,以便console.log('creating user');不会执行?

你需要把这些东西放在该回调的else分支中:

function addUser(request) {
return new Promise((res, rej) => {
ValidateFormData(request, CREATE_USER, (err) => {
if (err) {
rej(makeError(err));
} else {
console.log('creating user');
res();
}
});
});
}

将其放在异步回调之外(无论是在ValidateFormData外部,还是在new Promise外部)将导致它立即运行,并且当将来发生错误时,您将没有机会追溯阻止它。

或者,如果不止一个简单的 log() 不会失败,请使用then回调来处理结果:

function addUser(request) {
return new Promise((res, rej) => {
ValidateFormData(request, CREATE_USER, (err) => {
if (err) rej(makeError(err));
else res();
});
}).then(() => {
console.log('creating user');
…
});
}

这特别有用,因为它只允许util.promisify您的ValidateFormData功能。

你需要把所有东西都放在回调中,在那里你可以控制执行的代码流,并对err使用 if/else :

function addUser(request) {
return new Promise((res, rej) => {
ValidateFormData(request, CREATE_USER, (err) => {
if(err) {
rej(makeError(err));
} else {
console.log('creating user');
res();
}
});
})
}

请记住,您还可以使用util.promisify()将异步回调函数转换为承诺返回函数。

ValidateFormData(request, CREATE_USER, (err) => {if(err) return rej(makeError(err)) });
console.log('creating user');

假设ValidateFormData函数是异步的(很可能是异步的,因为您有回调),以下console.log不会等待它完成。 因此,无论ValidateFormData是否完成,它都会运行。

Javascript 异步执行,这就是为什么console.log("creating user")ValidateFormData中的回调函数之前执行的原因。把你的console.log放在回调函数中,一切都会好起来的。

function addUser(request) {
return new Promise((res, rej) => {
ValidateFormData(request, CREATE_USER, (err) => {
if(err) { 
return rej(makeError(err)) 
}
console.log('creating user'); 
});
}

最新更新