【问题标题】:Wait until a callback ends to continue execution in Angular等到回调结束以继续在 Angular 中执行
【发布时间】:2016-08-22 14:15:00
【问题描述】:

我在理解回调如何工作时遇到了一些问题。 我正在编写一个必须验证用户输入的函数。 在函数内部,我必须对我的 API 进行 HTTP GET 调用,以根据用户输入执行检查。

问题是验证函数是从流程函数中调用的,而提交函数是在我在 validate() 中进行的 HTTP 调用之前调用的。 我无法编辑进程函数,因为它是其他组件使用的函数。

form.process = function(){
     // do stuffs
     validate();
     submit();
}

form.validate = function () {
    // lots of checks regarding the model
    ...
    // HTTP GET call
}

是否可以让提交函数等到 validate() 中的 HTTP GET 调用结束?

提前致谢:)

【问题讨论】:

  • 您的validate 函数是否返回任何deferredpromise
  • 如果您无法编辑process,那么您就不走运了。 HTTP 请求始终是异步的,因此submit() 将在 HTTP 请求返回之前运行。 (好吧,显然you can make them synchronous 但它会使浏览器挂起。)
  • 我很困惑...为什么不能编辑进程函数?它在调用 validate 函数,所以即使其他组件在使用 process 函数,它仍然在调用 validate 函数,如果不起作用,那么当其他组件调用它时,它也不起作用......
  • 嗯,这没有意义 :) 你的 process() 函数没有按照你的意愿工作,所以你必须改变它

标签: javascript angularjs asynchronous callback asynccallback


【解决方案1】:

您必须修改 validate 以返回如下承诺:

form.validate = function () {
    var deferred = $q.defer();
    // lots of checks regarding the model
    ...
    // In http GET call:
    // If success
    deferred.resolve(<any value>);
    // If errors
    deferred.reject(<any value>);
    // and now return the promise
    return deferred.promise;
}

现在你可以像这样在处理函数中做任何你想做的事情:

form.process = function(){
   // do stuffs
   validate().then(function(response){
      submit();
   }, function(reject){
      // do something like showing error.
   });
}

如果您有更多使用此功能的组件,您必须像这样编辑所有组件。 无论如何,这是在组件的每个“验证”函数中实现其他 GET 调用的最佳方式。

【讨论】:

  • 这正是我所做的 :) 感谢您的回答!
猜你喜欢
  • 2019-09-23
  • 2018-06-21
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多