【问题标题】:Conditional on Function Evaluation Preempts Promise以函数评估为条件优先于 Promise
【发布时间】:2017-12-05 11:42:59
【问题描述】:

我有一个类似的问题:How do I wait for a promise to finish before returning the variable of a function?

我有一个函数pass() 可以进行一些表单验证。作为其中的一部分,它有时会打开一个用户必须在返回值之前关闭的模式,如下所示:

if ($scope.model.validation == "No") {
  $scope.modalInstance = $uibModal.open({
    animation: true,
    templateUrl: 'pleaseval.html',
    controller: 'PleaseValCtrl',
    size: 'lg'
  }).closed.then(function() {
    return true;
  });
}

请注意,在模式关闭之前它不会return true

但是,我有一个基于函数评估的条件

if(pass(form))
{
//some code here
}
else{
alert("Please fill out all the required information before hitting 'Next'");
}

因为它等待一个承诺(模式关闭)它返回false并触发警报,而不是等待模式关闭并实际触发true

如何构建此代码,以便在等待模式关闭时不触发警报?

谢谢!

编辑:我应该注意我可以这样做:

pass(form).then(function(result){
if(result)
{

问题在于,如果将不需要等待模式的参数传递给pass(),我会得到一个未定义的承诺。

TypeError: 无法读取未定义的属性“then”

【问题讨论】:

  • 你能解释一下你为什么在这里使用promise吗? pass 是一个长期运行的验证后端进程吗?如果您只是运行客户端验证,则坚持同步调用将起作用。

标签: javascript angularjs


【解决方案1】:

由于您的编辑,听起来pass 有时会返回一个承诺。仅供参考,在未来,pass 的完整代码会有所帮助,尤其是关于它返回的内容 - 您发布的代码实际上没有显示任何关于 pass 返回的内容,因为“返回 true”实际上并不是 pass自己正在返回。

您需要确保 pass 总是在每个代码路径中返回一个 Promise。如果模式不是必需的,并且您有一个同步返回值,则使 pass 返回 Promise.resolve(true); - 即 true 的值,但包装为一个承诺,因此 pass 的返回值始终是 thenable。这样pass的调用者就不需要知道或关心操作是同步完成还是异步完成。

【讨论】:

  • Promise.resolve(true); 不会为 if(result) 部分触发 true...我必须传递其他参数吗?
  • @SummerDeveloper 发布pass 的完整代码 - 或至少处理流程控制的每个部分(承诺、if/else、返回等)。
  • 它确实有效,它只是打破了其他一些令人困惑的问题,但我认为超出了这个问题的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多