javascriptの非同期はいくつかのモードを実行します.

2238 ワード

1、コールバック関数
function f1(callback) {
  // f1    

  // f1      ,      
  callback();
}
同じである
f1(f2);
2、時間駆動モードを採用し、イベントの傍受
function f1(){
  setTimeout(function () {
    // f1     
    f1.trigger('done');
  }, 1000);
}

function f2(){
console.log('    ');
}
f1.on('done',f2);
3、定期購読を発表することは、rabitmq生産者、消費者メカニズムと同じである.
function f1(){
    setTimeout(function () {
        // f1     
        jQuery.publish("done");
    }, 1000);
}
jQuery.subscribe("done", f2);
非同期フロー制御
async(1, function(value){
  async(value, function(value){
    async(value, function(value){
      async(value, function(value){
        async(value, function(value){
          async(value, final);
        });
      });
    });
  });
});
```

    
```javascript
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
function series(item) {
  if(item) {
    async( item, function(result) {
      results.push(result);
      return series(items.shift());
    });
  } else {
    return final(results);
  }
}
series(items.shift());
```

    
```javascript
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];

items.forEach(function(item) {
  async(item, function(result){
    results.push(result);
    if(results.length == items.length) {
      final(results);
    }
  })
});
```

        
```javascript

var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
var running = 0;
var limit = 2;

function launcher() {
  while(running < limit && items.length > 0) {
    var item = items.shift();
    async(item, function(result) {
      results.push(result);
      running--;
      if(items.length > 0) {
        launcher();
      } else if(running == 0) {
        final(results);
      }
    });
    running++;
  }
}
launcher();
```

promise
```javascript
(new Promise(f1)).then(f2);
```

```javascript
//     
step1(function (value1) {
  step2(value1, function(value2) {
    step3(value2, function(value3) {
      step4(value3, function(value4) {
        // ...
      });
    });
  });
});

// Promises   
(new Promise(step1))
  .then(step2)
  .then(step3)
  .then(step4);
```

Promise       ,