スライドをクリックでスタート、矢印キーでスライド移動、Escで一覧モードへ戻る
Promisesのキホン
約束の🍣🍣🍣🍣🍣🍣
var promise = new Promise(function(resolve, reject) { /* (非同期)処理 */ });
promise.then(onFulfilled, onRejected);
promise.catch(onRejected);
Promise.all() 、 Promise.resolve() などの便利メソッド系
function asyncFunction() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world');
}, 16);
});
}
asyncFunction().then(function (value) {
console.log(value);// => 'Async Hello world'
}).catch(function (error) {
console.log(error);// => エラーが合った時はこちら
});

thenで登録しておいた関数が呼ばれるresolve には 結果の値 を渡す(解決)reject には Errorオブジェクト を渡す(棄却)throw しないでErrorオブジェクトを渡すマナー
Pending、Fulfilled、RejectedPending -> Settled(Fulfilled or Rejected)時に関数を呼ぶreadyState ProgressEventsPromise.allがつよいfunction getURL(URL) {
return new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', URL, false);
req.onload = function () {
resolve(req.response);
};
req.onerror = function () {
reject(new Error(req.statusText));
};
req.send();
});
}
resolve なら onFulfilled が呼ばれるreject なら onRejected が呼ばれるvar URL = "http://example.com/json";
getURL(URL).then(function onFulfilled(value){
console.log(value);
}).catch(function onRejected(error){
console.log(error);
});
先ほどのXHRで取得したJSONデータを処理したい
それぞれの違いを見てみる
function getURLCallback(URL, callback) {
var req = new XMLHttpRequest();
req.open('GET', URL, false);
req.onload = function () {
callback(null, req.response);
};
req.onerror = function () {
callback(new Error(req.statusText));
};
req.send();
}
function jsonParse(callback, error, value) {
if (error) {
callback(error, value);
} else {
try {
var result = JSON.parse(value);
callback(null, result);
} catch (e) {
callback(e, value);
}
}
}
function main(callback){
var URL = 'http://example.com/json';
getURLCallback(URL, jsonParse.bind(null, callback));
}
main(function(error, value){
if(error){
// => エラーが起きた場合
}
console.log(value);// => 取得したデータのオブジェクト
});
JSON.parse は例外となるケースがあるためラップしたjsonParse関数を使うcallback(error,value) というルールを適応main にエラーを集約するには意識して書く必要があるfunction main(callback){
var URL = 'http://example.com/json';
return getURL(URL).then(JSON.parse);
}
main.then(function(value){
console.log(value);// => 取得したデータのオブジェクト
}).catch(function(error){
console.error(error);// => エラーが起きた場合
);
JSON.parse をそのまま使っているcatchできるmain() はpromiseオブジェクトを返しているPending、Fulfilled、RejectedのみaPromise.then(…).then(…).catch(…);
aPromise の状態の変化は1回しかおきない=> aPromise !== aPromise.then(…);// true => 新しいPromise Object
.then は新しくPromiseオブジェクトを作って返してる