从另一个函数调用Angularjs函数,然后等待它的响应

Angularjs function call from another function and wait its response

本文关键字:等待 响应 然后 另一个 函数调用 Angularjs 函数      更新时间:2023-09-26

我已经寻找了一个解决方案,但我没有找到这样的东西。

我正在使用angular,我想在另一个函数中调用一个函数,并等待它的响应。

第二个函数是:

self.changeProvider = function() {
    var contexec = false;
    if (!checkIsFit()) {
      contexec = true;
    } else {
      contexec = false;
    }

  if (contexec) {
      var modalOptions = {
          closeButtonText: $translate.instant('closeButtonText'),
          actionButtonText: $translate.instant('ok'),
          headerText: $translate.instant('changeProvidertitle'),
          bodyTemplate: '../themes/default/src/app/shoppingCart/changeProvider/changeProvider.tpl.html',
          margin: true
      };

      var modalDefaults = {
          backdrop: 'static',
          templateUrl: '../themes/default/src/app/shoppingCart/changeProvider/changeProvider.tpl.html',
          controller: 'ChangeProviderCtrl',
          size: 'sm',
          resolve: {
              modalData: function() {
                  return {
                      data: $scope.arrayToChangeProvider
                  };
              }
          }
      };
      modalService.showModal(modalDefaults, modalOptions)
          .then(function(result) {
//some stuff
              });
          }
      };

另一个功能:

  var checkIsFit = function() {
    if ( $scope.cabstatus != 4 ) {
      return false;
    } else {
            var modalOptions = {
            closeButtonText: $translate.instant('closeButtonText'),
            actionButtonText: $translate.instant('ok'),
            headerText: $translate.instant('cabisfittedtitle'),
            bodyTemplate: '../themes/default/src/app/shoppingCart/checkIsFit/checkIsFit.tpl.html',
            margin: true
           };

        var modalDefaults = {
            backdrop: 'static',
            templateUrl: '../themes/default/src/app/shoppingCart/checkIsFit/checkIsFit.tpl.html',
            controller: 'CheckIsFitCtrl',
            size: 'sm',
            resolve: {
                modalData: function() {
                    return {
                    };
                }
            }
        };
          modalService.showModal(modalDefaults, modalOptions)
            .then(function(result) {
              if (result.msg === 'ok') {
                var params = {
                  token: $scope.token,
                  fkidpedido: $scope.pendingOrderLineList[0].FK_IDPEDIDO,
                  userid : $scope.userid
                  };
                shoppingCartService.postResetAgr(params, function() {
                    return true;
                }, function() {
                    /*Notification.error({
                        message: $translate.instant('components.activity.actions.deleteActivityError')
                    });*/
                });
                return false;
              } else {
                return true;
              }
          });
      }
  };

问题是函数changeProvider仍在执行,并首先打开模态来解决函数checkIsFit()我想等checkIsFit解决了再继续changeProvider的功能我不能在changeProvider中包含checkIsFit()功能,因为我想在其他函数中使用checkIsFit()

任何帮助将不胜感激。

Thanks in advance

我相信您正在寻找的是延迟对象和承诺。查看$q:

的文档

https://docs.angularjs.org/api/ng/service/美元q

我建议大家好好读读这篇文章,因为这对任何Javascript开发者来说都是一个非常重要和强大的概念。

本质上,延迟对象和承诺允许您运行异步进程并在进程完成时回调函数。

modalService.showmodal方法返回一个promise。创建返回这些承诺的函数。

  var modalPromise1Fn = function () {
      var promise1 = 
          modalService.showModal(modalDefaults1, modalOptions2)
              .then(function(result) {
                  //some stuff
               });
      return promise1;
  };
  var modalPromise2Fn = function () {
      var promise2 = 
          modalService.showModal(modalDefaults2, modalOptions2)
              .then(function(result) {
                  //some stuff
               });
      return promise2;
  };

使用第一个承诺的.then方法到第二个承诺。

var derivedPromise = 
    modalPromise1Fn().then( function() {
        var promise2 = modalPromise2Fn();
        //return to chain the second promise
        return promise2;
   });

From the Docs:

链接承诺

因为调用承诺的.then方法会返回一个新的派生承诺,所以很容易创建一个承诺链。

可以创建任何长度的链,并且由于一个承诺可以与另一个承诺一起解析(这会进一步推迟它的解析),因此可以在链中的任何点暂停/延迟承诺的解析。这使得实现强大的api成为可能。

——AngularJS $q Service API Reference——链接承诺