这是函数:
function addUser(request) {
return new Promise((res, rej) => {
ValidateFormData(request, CREATE_USER, (err) => {if(err) return rej(makeError(err)) });
console.log('creating user');
res();
})
}
当回调包含ValidateFormData
err
时如何停止函数,以便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');
});
}