我需要执行多个功能,其中一些功能可能包括单击按钮时的异步回调(基于条件)。
我有一个提交按钮我不想要阻止默认行为来执行这些操作(即e.preventDefault())
相反,我需要简单地返回true或false:
$('#submitBtn').click(function(e) {
return mdl.entry(e);
});
var mdl: {
entry: function(evt) {
if (condition) {
return ...
} else {
return anotherFunction();
}
}
}
function anotherFunction() {
// This function could potentially involve one or more
// asynchronous requests
some.func(obj).then(function(result) {
... do stuff
});
}
处理这个问题的最佳方法是什么?我知道我可以轮询全局变量,或设置变量并触发click事件:
$('#submitBtn').click(function(e) {
if (!safeToSubmit) {
e.preventDefault();
mdl.entry(e);
// when finished, it sets safeToSubmit to true
// and triggers a click on the button
}
});
我希望我的问题有道理。上面是虚拟代码。可能有10个不同的函数有条件地进行异步调用。也许是最佳实践问题?我可以让它发挥作用......我只想要一个更好的方法:)
答案 0 :(得分:0)
解决这个问题的一种方法是始终返回Promise。对于同步函数而不是return someValue
return Promise.resolve(someValue)
然后你可以用以下的方式以相同的方式处理返回值:
mdl.entry(e)
.then((ret) => { //do stuff with ret })
编辑:
我想象的是这样的事情:
$('#submitBtn').click(function(e) {
mdl.entry(e)
.then((ret) => { /* whatever is supposed to be donw with the return */ })
});
var mdl = {
entry: function(evt) {
if (condition) {
var res = someSynchronousFunction(evy)
return Promise.resolve(res)
} else {
return anotherFunction();
}
}
}
function anotherFunction() {
return someAsyncFunction(obj).then(function(result) {
//... do stuff and return a value
// someAsyncFunction will return a promise that resolves to this value
});
}