我有以下示例:
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/