Javascript非同期プログラミング方法のまとめ
7055 ワード
function f1(callback){
setTimeout(function(){
//f1
callback();
},1000);
}
実行するとf 1(f 2)になる.この方法を採用して同期を非同期にしても、f 1はプログラムの実行を滞らせず、プログラムを先に実行する主要なロジックに相当し、時間の経過を全部部分的に遅らせて実行します.コールバック関数の利点:簡単で、分かりやすく、展開ができます.短所:コードの読み取りとメンテナンスに不利です.一つの同期(ブロッキング)では、コールバックの例を用いて、Fnc 1コードの実行が完了した後にFnc 2コードを実行することを目的とする.var func1 = function(callback){
// do something
(callback && typeof(callback) === "function") && callback();
}
func1(func2);
var func2 = function(){}
f1.on('done', f2);
f 1でdoneイベントが発生すると、f 2が実行される.そして、f 1を書き換えるfunction f1(){
setTimeout(function*(){
// f1
f1.trigger('done');
},1000);
}
利点:分かりやすく、複数のイベントを結びつけることで、各イベントごとに複数のコールバック関数を指定して結合し、モジュール化することができる.function f1(){
setTimeout(function(){
// f1
jquey.publish('done');
}, 1000);
}
jquey.publish('done')つまり、f 1の実行が完了したら、信号センターにdone信号を送信し、f 2の実行を開始する.f 2実行後、購読をキャンセルすることもできます.jquery.unsubscribe("done", f2);
const instance = new Promise((resolve, reject) => {
//
if(/* */) {
resolve(value);
} else {
reject(error);
}
}
})
instance.then(value => {
// do something...
}, error => {
// do something...
})
コンストラクション内部のコードは直ちに実行されます.then方法は新しいPromiseの例を返します.二つの場合に分けて見られます.function sayHi(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(name);
}, 2000)
})
}
sayHi(' ')
.then(name => {
console.log(` , ${name}`);
return sayHi(' '); // resolved then
})
// name then
.then(name => {
console.log(` , ${name}`);
return sayHi(' ');
})
.then(name => {
console.log(` , ${name}`);
})
// ,
// ,
// ,
read('./file-01.txt', 'utf8')
.then(data => {
// read promise , read promise
// promise then resolve
return read(data, 'utf8');
}, err => {
console.log(err);
})
.then(data => {
// , then
return [data];
}, err => {
console.log(err);
})
.then(data => {
//
console.log(data);
// return , undefined , then undefined
}, err => {
console.log(err);
})
.then(data => {
// then , undefined
// undefined
console.log(data);
// , then reject
throw new Error('xxx');
}, err => {
console.log(err);
})
.then(null, err => {
// then , reject
// reject then undefined
console.log(err);
})
.then(data => {
// then , undefined
console.log('resolve');
}, err => {
console.log('reject');
});
read('./file-01.txt', 'utf8')
.then(data => {
return read(data, 'utf8');
})
.then(data => {
return [data];
})
.then(data => {
console.log(data);
})
.then(data => {
console.log(data);
// ,
// then reject , catch
throw new Error('xxx');
})
.then(null)
.then(data => {
console.log('resolve');
})
.catch(err => {
console.log(err);
});
let fs = require('fs')
function read(file) {
return new Promise(function(resolve, reject) {
fs.readFile(file, 'utf8', function(err, data) {
if (err) reject(err)
resolve(data)
})
})
}
async function readResult(params) {
try {
let p1 = await read(params, 'utf8')
//await Promise ,
//await return , then 。
let p2 = await read(p1, 'utf8')
let p3 = await read(p2, 'utf8')
console.log('p1', p1)
console.log('p2', p2)
console.log('p3', p3)
return p3
} catch (error) {
console.log(error)
}
}
readResult('1.txt').then( // async promise
data => {
console.log(data)
},
err => console.log(err)
)
// p1 2.txt
// p2 3.txt
// p3
//
function readAll() {
read1()
read2()//
}
async function read1() {
let r = await read('1.txt','utf8')
console.log(r)
}
async function read2() {
let r = await read('2.txt','utf8')
console.log(r)
}
readAll() // 2.txt 3.txt
async function func() {
try {
const num1 = await 200;
console.log(`num1 is ${num1}`);
const num2 = await Promise.reject('num2 is wrong!');
console.log(`num2 is ${num2}`);
const num3 = await num2 + 100;
console.log(`num3 is ${num3}`);
} catch (error) {
console.log(error);
}
}
func();
// num1 is 200
//
// num2 is wrong!
参考:-Javascript非同期プログラミングの4つの方法-非同期方法の開発プロセス-JS非同期プログラミングの6つの方法