スライドをクリックでスタート、矢印キーでスライド移動、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
、Rejected
Pending
-> Settled(Fulfilled
or Rejected
)時に関数を呼ぶreadyState
ProgressEvents
Promise.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オブジェクトを作って返してる