zoukankan      html  css  js  c++  java
  • angular中$q用法, $q多个promise串行/同步/等待), $q.all用法,使用

    $q的基本用法

    function fn() {
        var defer = $q.defer();
        setTimeout(function () {
            console.log(1);
            defer.resolve(6);
        }, 2000);
        return defer.promise;
    }
    
    fn().then(function (data) {
        console.log(data); //2000ms后打印6
    }).catch(function (err) {
        console.error(err);
    });
    //或者用$q.when(fn()), 和上面是同样的效果
    $q.when(fn()).then(function (data) {
        console.log(data);
    }).catch(function (err) {
        console.error(err);
    });

    $q多个promise串行

    function f1() {
        var defer = $q.defer();
       setTimeout(function() {
           defer.resolve(1);
       }, 2000);
       return defer.promise;
    }
    
    function f2() {
        var defer = $q.defer();
        setTimeout(function() {
            defer.resolve(2);
        }, 2000);
        return defer.promise;
    }
    
    function f3() {
        var defer = $q.defer();
        setTimeout(function() {
            defer.resolve(3);
        }, 2000);
        return defer.promise;
    }
    
    //f1进行完,在进行f2,然后进行f3,后一个程序等待前一个完成
    f1().then(function (data) {
        console.log(data);  // 2s后打印1
        return f2();
    }).then(function (data) {
        console.log(data);   // 再过2s后打印2
        return f3();
    }).then(function (data) {
        console.log(data);  // 再过2s后打印3
    });

    $q.all

    $q.all是用于执行多个异步任务进行回调,它可以接受一个promise的数组,或是promise的hash(object)。任何一个promise失败,都会导致整个任务的失败。

    $q.all中接收多个promise是同时进行的。

    例1:接受一个promise的hash(object):

    <!DOCTYPE html>
    <html ng-app="app">
    <head>
      <title></title>
      <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    </head>
    <body>
      <div ng-controller="ctrl1">
      </div>
      <script>
        var app = angular.module('app',[]);
        app.controller('ctrl1',['$scope','$q',function($scope,$q){
          var deferA = $q.defer();
          setTimeout(function(){
            deferA.resolve('this is DATA A')
          },500);
          var deferB = $q.defer();
          setTimeout(function(){
            deferB.resolve('this is DATA B');
          },1000);
          var p=$q.all({
            dataA:deferA.promise,
            dataB:deferB.promise
          })
          p.then(function(result){
            console.log(result.dataA); // this is DATA A
            console.log(result.dataB); // this is DATA B
          })
          .catch(function(error){
            console.error(error);
          })
        }])
    
      </script>
    </body>
    </html>

    例2:接受一个promise数组:

    <!DOCTYPE html>
    <html ng-app="app">
    <head>
      <title></title>
      <script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script>
    </head>
    <body>
      <div ng-controller="ctrl1">
      </div>
      <script>
        var app = angular.module('app',[]);
        app.controller('ctrl1',['$scope','$q',function($scope,$q){
          var deferA = $q.defer();
          setTimeout(function(){
            deferA.resolve('this is DATA A')
          },500);
          var deferB = $q.defer();
          setTimeout(function(){
            deferB.resolve('this is DATA B');
          },1000);
          var p=$q.all([
            deferA.promise,
            deferB.promise
          ]);
          p.then(function(result){
            console.log(result[0]); // this is DATA A
            console.log(result[1]); // this is DATA B
          })
          .catch(function(error){
            console.error(error);
          })
        }])
    
      </script>
    </body>
    </html>

    参考:http://blog.csdn.net/shidaping/article/details/52398925

  • 相关阅读:
    [刘阳Java]_eayui-pagination分页组件_第5讲
    [刘阳Java]_easyui-draggable拖动组件_第4讲
    [刘阳Java]_easyui-panel组件入门级_第3讲
    [刘阳Java]_TortoiseSVN基础应用_第1讲
    [刘阳Java]_SpringMVC文件上传第2季_第11讲
    [刘阳Java]_Spring中IntrospectorCleanupListener的用途【补充】_第16讲
    使用fetch代替ajax请求 post传递方式
    react购物车demo
    react-redux异步数据操作
    redux模块化demo
  • 原文地址:https://www.cnblogs.com/bagexiaowenti/p/8259713.html
Copyright © 2011-2022 走看看