javascript - 从另一个函数停止函数执行

标签 javascript node.js

我有以下示例:

function foo1 (callback) {

    if (!foo2(callback)) {
        return;
    }

    console.log("Doing something");
    /* do something */
}

function foo2 (callback) {
    return callback ();
}

foo1 (function () {
     console.log ("Hello World!");
});

我想从 foo1 中删除 if。我可以通过调用 foo2 来停止 foo1 的执行吗?我正在寻找这样的东西:

function foo1 (callback) {

    foo2(callback); // calling foo2 this way I want to prevent
                    // the console.log below to be executed

    console.log("Doing something");
    /* do something */
}

有什么办法可以做到这一点吗?

请注意,我不想引发错误。我只想调用回调函数并停止函数执行。

用例

而不是这个:

 function a (options, callback) {

     callback = callback || function () {};
     if (typeof callback !== "function") {
         callback = function (err) { console.log (err); }
     }

     if (!options.someField || options.someField.constructor !==  Object) {
         return callback ("someField should be an object");
     }

     /* do something */
 }

我想要:

 function a (options, callback) {

     validateFunction (callback, callback);
     validateObject (options, callback);
     validateObject (options.somField, callback);

     /* do something */
 }

如果其中一个 validate* 函数失败,它应该通过callback 发送错误并停止a 函数执行。

最佳答案

如果你可以使用promises :

 function a (options) {
     return validateObject(options).then(function(){
         return validateObjecT(options.somField);
     }).then(function(){
          return validateObjecT2(options.somField);
     }).then(function(){
          return validateObjecT3(options.somField);
     }).then(function(){
          return validateObjecT4(options.somField);
     }).then(function(){
          /*do something*/
     });
 }

 var validateObject = Promise.method(function(object) {
      // Because this is inside Promise.method, thrown error
      // will be equal to return Promise.reject(new Error("invalid"));
      if (typeof object !== "object") throw new Error("invalid");
 });
<小时/>

或者,函数 a 也可以这样完成:

function a (options) {
 // If any validation fails, the do something is skipped
 // and the code resumes at the next .catch() with the validation
 // error passed as parameter
 return Promise.all([
    validateObject(options),
    validateObject2(options),
    validateObject3(options),
    validateObject4(options),
    validateObject(options)
 ]).then(function(){
    /*do something*/
 })
}
<小时/>
 a({}).then(function() {
    // Validation succeeded and everything was done
 }).catch(function(e) {
    // Validation or something else failed, e is the rejection error
 });

顺便说一句,不要使用字符串作为错误,a string is not an error .

也就是说,永远不要这样做:

throw "foo";
callback("foo");
reject("foo") // When using promises

而是这样做:

throw new Error("foo");
callback(new Error("foo"));
reject(new Error("foo")) // When using promises

关于javascript - 从另一个函数停止函数执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22830017/

相关文章:

javascript - 将 <div> 附加到正文中一次

javascript - 删除 jQuery 中的元素

javascript - 使用 Scraperjs 抓取时字符集错误

api - CouchDB 作为 Restful API 层?

node.js - 在 NW.js - 应用程序中发布哪些许可证?

javascript - 将两个下拉列表的选定值发送到 PHP 脚本,而不使用 AJAX 提交

javascript - 如何在带 meteor 的 Handlebars 助手中使用多个参数?

javascript - 什么更快 : try catch vs Promise

node.js - 如何使用 Node.js 后端访问 EJS 模板中的 session 数据?

Javascript - 更改 Google Chart onClick