功能如下:
export const query = graphql`
allMarkdownRemark {
nodes {
frontmatter {
title
feature {
publicURL
}
}
}
}
`
}
当const ArticleHeader = ({ frontmatter }) => {
const { title, feature } = frontmatter
if (!feature) return <Heading ... />
return (
<div style={`background-image:url(${feature.publicURL})`}>
<Heading ...>
</div>
)
}
回调包含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
时,如何停止该函数?
答案 0 :(得分:2)
您需要将这些内容放入回调中的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
函数。
答案 1 :(得分:2)
您需要将所有内容放入回调中,以控制执行的代码流,并对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()
将异步回调函数转换为承诺返回函数。
答案 2 :(得分:0)
ValidateFormData(request, CREATE_USER, (err) => {if(err) return rej(makeError(err)) });
console.log('creating user');
假设ValidateFormData
函数是异步的(很可能是因为您有回调),下面的console.log
不会等待它完成。
因此,无论ValidateFormData
是否完成,它都会运行。
答案 3 :(得分:0)
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');
});
}