Angularjs函数从另一个函数调用并等待其响应

时间:2016-08-16 18:19:01

标签: javascript angularjs

我正在寻找溶剂,但我没有找到类似的东西。

我正在使用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的功能 我无法在checkIsFit()中包含changeProvider功能,因为我想将checkIsFit()用于其他功能。

任何帮助都将不胜感激。

提前致谢

2 个答案:

答案 0 :(得分:4)

我相信你所寻找的是延期对象和承诺。查看$ q的文档:

https://docs.angularjs.org/api/ng/service/$q

我建议给予一个好的阅读,因为对于任何Javascript开发人员来说这是一个非常重要且强大的概念。

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

答案 1 :(得分:0)

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

来自文档:

  

链接承诺

     

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

     

可以创建任意长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。这使得实现强大的API成为可能。

- AngularJS $q Service API Reference -- Chaining Promises