Javascript 我应该如何在返回声明中处理这个有条件的承诺?
我需要执行多个功能,其中一些功能在单击按钮时可能包含异步回调(基于条件) 我有一个提交按钮,我不想阻止默认行为来执行这些操作(即preventDefault()) 相反,我需要简单地返回true或false:Javascript 我应该如何在返回声明中处理这个有条件的承诺?,javascript,jquery,Javascript,Jquery,我需要执行多个功能,其中一些功能在单击按钮时可能包含异步回调(基于条件) 我有一个提交按钮,我不想阻止默认行为来执行这些操作(即preventDefault()) 相反,我需要简单地返回true或false: $('#submitBtn').click(function(e) { return mdl.entry(e); }); var mdl: { entry: function(evt) { if (condition) { return ... }
$('#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
});
}
处理这个问题的最好方法是什么?我知道我可以轮询全局变量,或设置变量并触发单击事件:
$('#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个不同的函数有条件地进行异步调用。也许是一个最佳实践问题?我可以让它工作。。。我只想要一个更好的方法:)解决这个问题的一个方法就是总是回报承诺。对于同步函数而不是
返回someValue
您返回承诺。解析(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
});
}
您不能同步返回。您必须始终返回
false
,然后在所有操作完成后(并将true
作为其结果),直接提交表单。@Bergi我很害怕。至少我一直没有做错。为什么要尝试从事件处理程序中返回
?@guest271314使用preventDefault的原因与您使用preventDefault的原因相同,只是没有破坏执行链。可能无法在异步过程中或以下异步过程中的元素上调度事件。到底是什么问题,你们想达到什么目的?你们介意从我的代码中再提取一些片段来详细阐述一下吗?请:)@user1447679当然,也许编辑会让它更清晰一些。您可能希望在不同的位置放置不同的东西,但基本思想是不希望混合使用异步和同步代码。您希望它都是异步的,这是Promise.resolve()
允许您做到的。