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

时间:2017-07-24 23:45:13

标签: javascript jquery

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

我有一个提交按钮我不想要阻止默认行为来执行这些操作(即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个不同的函数有条件地进行异步调用。也许是最佳实践问题?我可以让它发挥作用......我只想要一个更好的方法:)

1 个答案:

答案 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
    });
}