Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS+;如何在运行下一个任务之前等待任务完成_Angularjs - Fatal编程技术网

AngularJS+;如何在运行下一个任务之前等待任务完成

AngularJS+;如何在运行下一个任务之前等待任务完成,angularjs,Angularjs,我的数据库仍然有问题,但我发现,问题来自于这样一个事实,打开数据库需要一些时间,但应用程序并没有等到这个任务完成 有没有办法让angular在数据库正确打开后再开始下一个任务 谢谢, 基督教徒 更新:2016-08-08-03:13下午 谢谢你的回答。正如我所见,我的第一个承诺($q)的想法是正确的,但是: 我的应用程序有一个app.js,它是我的主文件。它只调用InitDB。这将打开数据库。然后它应该调用CreateTables,这将创建表,如果它不存在的话 我的应用程序的其余部分分为4页(

我的数据库仍然有问题,但我发现,问题来自于这样一个事实,打开数据库需要一些时间,但应用程序并没有等到这个任务完成

有没有办法让angular在数据库正确打开后再开始下一个任务

谢谢, 基督教徒


更新:2016-08-08-03:13下午

谢谢你的回答。正如我所见,我的第一个承诺($q)的想法是正确的,但是:

我的应用程序有一个app.js,它是我的主文件。它只调用InitDB。这将打开数据库。然后它应该调用CreateTables,这将创建表,如果它不存在的话

我的应用程序的其余部分分为4页(模板)。每个页面都有自己的控制器

因此,我们的想法是初始化数据库,创建表,然后使用数据库,但在不同的控制器上使用

这行不通,因为我总是需要把我所有的东西放在app.js中initDB的.then()中

这是我的第一个AngularJS应用程序,也许这就是我犯很多错误的原因

谢谢,
Christian。

Angular提供$q的服务。一种服务,可帮助您异步运行函数,并在函数完成处理时使用其返回值(或异常)。请参阅相关文档。
$q基本上围绕承诺的概念展开。AngularJS中的承诺由内置的$q服务提供。

Angular提供$q服务。一种服务,可帮助您异步运行函数,并在函数完成处理时使用其返回值(或异常)。请参阅相关文档。
$q基本上围绕承诺的概念展开。AngularJS中的承诺是由内置的$q服务提供的。

编写一个方法,检查连接是否建立……返回true或false

app.controller('MainCtrl', function($scope, httpq) {
    http.get('server call method')
      .then(function(data) {
        if(data.conn==true)
       // do what u want
      //write other calls
      })
      .catch(function(data, status) {
        console.error('error', response.status, response.data);
      })

    });

写一个方法,检查连接是否建立…返回true或false

app.controller('MainCtrl', function($scope, httpq) {
    http.get('server call method')
      .then(function(data) {
        if(data.conn==true)
       // do what u want
      //write other calls
      })
      .catch(function(data, status) {
        console.error('error', response.status, response.data);
      })

    });

您可以使用$q库

例如:

app.service("githubService", function ($http, $q) {
var deferred = $q.defer();

this.getAccount = function () {
    return $http.get('https://api.github.com/users/haroldrv')
        .then(function (response) {
            // promise is fulfilled
            deferred.resolve(response.data);
            // promise is returned
            return deferred.promise;
        }, function (response) {
            // the following line rejects the promise 
            deferred.reject(response);
            // promise is returned
            return deferred.promise;
        })
    ;
};
}))

使用上述服务:

app.controller("promiseController", function ($scope, $q, githubService) {
githubService.getAccount()
    .then(
        function (result) {
            // promise was fullfilled (regardless of outcome)
            // checks for information will be peformed here
            $scope.account = result;
        },
        function (error) {
            // handle errors here
            console.log(error.statusText);
        }
    );

}))

您可以使用$q库

例如:

app.service("githubService", function ($http, $q) {
var deferred = $q.defer();

this.getAccount = function () {
    return $http.get('https://api.github.com/users/haroldrv')
        .then(function (response) {
            // promise is fulfilled
            deferred.resolve(response.data);
            // promise is returned
            return deferred.promise;
        }, function (response) {
            // the following line rejects the promise 
            deferred.reject(response);
            // promise is returned
            return deferred.promise;
        })
    ;
};
}))

使用上述服务:

app.controller("promiseController", function ($scope, $q, githubService) {
githubService.getAccount()
    .then(
        function (result) {
            // promise was fullfilled (regardless of outcome)
            // checks for information will be peformed here
            $scope.account = result;
        },
        function (error) {
            // handle errors here
            console.log(error.statusText);
        }
    );

}))

Angular的核心概念之一是与服务/工厂合作。关于这些如何工作以及如何使用它们,有大量的文档和博客,但基本思想是这些是处理整个应用程序中共享数据和方法的单例“控制器”。与promises结合使用,您可以轻松创建一个服务来管理与数据库的通信

angular
  .module('myApp')
  .service('DBService', DBService)
  .controller('Ctrl1', Ctrl1)
  .controller('Ctrl2', Ctrl2)
  .controller('Ctrl3', Ctrl3)
  .controller('Ctrl4', Ctrl4);

DBService.$inject = ['$q'];
function DBService($q) {
  var DBService = this;
  var DBServiceDeferred = $q.defer();
  DBService.ready = DBServiceDeferred.promise;

  // a service is only initialized once, so this will only ever be run once
  (function() {
    init();
  })();

  function init() {
    // you can use promise chaining to control order of events
    // the chain will halt if any function is rejected
    initDB()
    .then(createTablesUnlessExist)
    .then(setDbReady);
  }

  function initDB() { 
    var deferred = $q.defer();
    // simulate async db initialization
    $timeout(function() {
      deferred.resolve();
      // or reject if there is an error
      // deferred.reject();
    }, 5000);
    return deferred.promise;
  };

  function createTablesUnlessExist() {
    //create tables if needed (only happens once)
    var deferred = $q.defer();
    // simulate async table creation
    $timeout(function() {
      deferred.resolve();
      // or reject if there is an error
      // deferred.reject();
    }, 5000);
    return deferred.promise;
  }

  function setDbReady() {
    DBServiceDeferred.resolve();
  }
}
现在你有了数据库设置,你不必再担心它了。您可以使用该服务从任何控制器访问数据库。在初始化数据库并创建表之前,不会运行任何查询

Ctrl1.$inject = ['DBService', '$q'];
function Ctrl1(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}
Ctrl2.$inject = ['DBService', '$q'];
function Ctrl2(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}
Ctrl3.$inject = ['DBService', '$q'];
function Ctrl3(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}
Ctrl4.$inject = ['DBService', '$q'];
function Ctrl4(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}

Angular的核心概念之一是与服务/工厂合作。关于这些如何工作以及如何使用它们,有大量的文档和博客,但基本思想是这些是处理整个应用程序中共享数据和方法的单例“控制器”。与promises结合使用,您可以轻松创建一个服务来管理与数据库的通信

angular
  .module('myApp')
  .service('DBService', DBService)
  .controller('Ctrl1', Ctrl1)
  .controller('Ctrl2', Ctrl2)
  .controller('Ctrl3', Ctrl3)
  .controller('Ctrl4', Ctrl4);

DBService.$inject = ['$q'];
function DBService($q) {
  var DBService = this;
  var DBServiceDeferred = $q.defer();
  DBService.ready = DBServiceDeferred.promise;

  // a service is only initialized once, so this will only ever be run once
  (function() {
    init();
  })();

  function init() {
    // you can use promise chaining to control order of events
    // the chain will halt if any function is rejected
    initDB()
    .then(createTablesUnlessExist)
    .then(setDbReady);
  }

  function initDB() { 
    var deferred = $q.defer();
    // simulate async db initialization
    $timeout(function() {
      deferred.resolve();
      // or reject if there is an error
      // deferred.reject();
    }, 5000);
    return deferred.promise;
  };

  function createTablesUnlessExist() {
    //create tables if needed (only happens once)
    var deferred = $q.defer();
    // simulate async table creation
    $timeout(function() {
      deferred.resolve();
      // or reject if there is an error
      // deferred.reject();
    }, 5000);
    return deferred.promise;
  }

  function setDbReady() {
    DBServiceDeferred.resolve();
  }
}
现在你有了数据库设置,你不必再担心它了。您可以使用该服务从任何控制器访问数据库。在初始化数据库并创建表之前,不会运行任何查询

Ctrl1.$inject = ['DBService', '$q'];
function Ctrl1(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}
Ctrl2.$inject = ['DBService', '$q'];
function Ctrl2(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}
Ctrl3.$inject = ['DBService', '$q'];
function Ctrl3(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}
Ctrl4.$inject = ['DBService', '$q'];
function Ctrl4(DBService, $q) {
  $q.when(DBService.ready).then(function() {
    DBService.conn.query("Select something");
  });
}

您可以使用承诺,并在数据库启动时解决它:您可以使用承诺,并在数据库启动时解决它:嗨,JoelCDoyle,这是我阅读的intrestings答案之一。非常感谢。但现在我还有一些问题:1。在工厂中,可以直接调用init()函数。这安全吗?这意味着,当应用程序启动时,这个东西正在进行自身的日化?当应用程序关闭时,如何关闭它?2.我以为我必须把所有的数据库逻辑(CRUD)放在工厂里,但是你从控制器那里调用它?这只是一个简单的例子,还是最佳实践?3.在控制器中,如果DBService没有准备好,任务会等待还是产生错误?无限循环?你好。我使用您的所有提示完全重写了我的工厂,但在setDbReady()函数中,我总是会遇到一个错误。我没有使用DBService,而是使用PersistenceService。所以当我执行PersistenceService.ready.resolve()时;我得到错误类型error:PersistenceService.ready.resolve不是一个函数。。。有什么想法吗?谢谢,克里斯蒂安。你是对的,你不想从控制器内部进行查询,那只是为了演示。您可能希望在服务中创建控制器可以调用以进行查询的方法。我的代码有错误。这是一个带有正确工作代码的plunker。观察控制台以查看操作顺序:就关闭连接而言,您可以向服务添加一个关闭连接的方法。是,初始化服务时调用init方法。没有什么不安全或不正常的,但你可以做任何你真正想做的事。通过向服务中添加close方法,您可以像打开它一样轻松地关闭它。这些任务将按照您指定的顺序、时间段执行。如果一个任务中存在错误,则将取消所有其他任务。您可以通过“reject()”来查看这种行为,方法是在过程中的任何时候对延迟进行“reject()”,而不是解决它。嗨,JoelCDoyle。谢谢你的提示和工作。我想,我仍然有一个理解上的问题:这个系统只等待任务,不管它们是否工作?因为如果我故意在数据库中产生错误,所有任务都会一步一步地完成。嗨,JoelCDoyle,这是我读到的一个intrestings答案。非常感谢。但现在我还有一些问题:1。事实上