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

时间:2019-06-23 16:34:09

标签: javascript node.js

功能如下:

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时,如何停止该函数?

4 个答案:

答案 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'); 
   });
}