Javascript 我应该如何在返回声明中处理这个有条件的承诺?

Javascript 我应该如何在返回声明中处理这个有条件的承诺?,javascript,jquery,Javascript,Jquery,我需要执行多个功能,其中一些功能在单击按钮时可能包含异步回调(基于条件) 我有一个提交按钮,我不想阻止默认行为来执行这些操作(即preventDefault()) 相反,我需要简单地返回true或false: $('#submitBtn').click(function(e) { return mdl.entry(e); }); var mdl: { entry: function(evt) { if (condition) { return ... }

我需要执行多个功能,其中一些功能在单击按钮时可能包含异步回调(基于条件)

我有一个提交按钮,我不想阻止默认行为来执行这些操作(即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
  });
}
处理这个问题的最好方法是什么?我知道我可以轮询全局变量,或设置变量并触发单击事件:

$('#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()
允许您做到的。