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 ,