âPromisificationâ ã¯åç´ãªå¤æã表ãé·ãç¨èªã§ããã³ã¼ã«ããã¯ãåãä»ãã颿°ãããPromise ãè¿ã颿°ã¸ã®å¤æã§ãã
å¤ãã®é¢æ°ãã©ã¤ãã©ãªã¯ã³ã¼ã«ããã¯ãã¼ã¹ãªã®ã§ããã®ãããªå¤æã¯å®éãã°ãã°å¿ è¦ã¨ããã¾ããPromise ã¯ãã便å©ã§ããããããã®ãããªå¤æã¯çã«ããªã£ã¦ãã¾ãã
ããçè§£ããããã«ä¾ãè¦ã¦ã¿ã¾ãããã
ä¾ãã°ãç« åç½®ã: ã³ã¼ã«ãã㯠㮠loadScript(src, callback) ãèãã¦ã¿ã¾ãããã
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(null, script);
script.onerror = () => callback(new Error(`Script load error for ${src}`));
document.head.append(script);
}
// 使ç¨ä¾:
// loadScript('path/script.js', (err, script) => {...})
颿°ã¯æå®ããã src ã®ã¹ã¯ãªãããèªã¿è¾¼ã¿ãã¨ã©ã¼ã®å ´å㯠callback(err), èªã¿è¾¼ã¿ã«æåããå ´åã«ã¯ callback(null, script) ãå¼ã³åºãã¾ãããã¡ãã¯ä»¥åã¿ã¾ãããããã®ãã©ã¼ãããã¯ã³ã¼ã«ããã¯ã®ä½¿ç¨ã§åºãåæããã¦ãããã®ã§ãã
Promise åãã¦ã¿ã¾ãããã
æ°ãã loadScriptPromise(src) 颿°ã¯åããã¨ããã¾ãããã³ã¼ã«ããã¯ã®ä»£ããã« Promise ãè¿ãã¾ãã
ã¤ã¾ããsrc ã®ã¿ï¼callback ãªãï¼ã渡ããæ»ãå¤ã§ promise ãå¾ã¾ãããã® promise ã¯èªã¿è¾¼ã¿ãæåãã㨠script ã§ resolve ããããã§ãªããã°ã¨ã©ã¼ã§ reject ãã¾ãã
ãã¡ãã§ã:
let loadScriptPromise = function(src) {
return new Promise((resolve, reject) => {
loadScript(src, (err, script) => {
if (err) reject(err)
else resolve(script);
});
})
}
// 使ç¨ä¾:
// loadScriptPromise('path/script.js').then(...)
ã覧ã®éããæ°ãã颿°ã¯å
ã® loadScript 颿°ã®ã©ããã¼ã§ããçµæã Promise ã® resolve/reject ã«å¤æããç¬èªã®ã³ã¼ã«ããã¯ãæä¾ããå¼ã³åºãã¾ãã
ããã§ loadScriptPromise 㯠Promise ãã¼ã¹ã®ã³ã¼ãã«ãããã£ãããã¾ããã³ã¼ã«ããã¯ããã promise ã®æ¹ãããï¼ãã®å¾ãã®çç±ãã¿ã¦ããã¾ãï¼ãªãã代ããã«ãã¡ããå©ç¨ãã¾ãã
å®éã«ã¯ãè¤æ°ã®é¢æ°ã promise åããå¿ è¦ãããããããã¾ããããã®å ´åã¯ãã«ãã¼ãç¨æããã®ã便å©ã§ãã
promisify(f) 㯠Promise åãã颿° f ã弿°ã«åããã©ããã¼é¢æ°ãè¿ãã¾ãã
function promisify(f) {
return function (...args) { // ã©ããã¼é¢æ°ãè¿ãã¾ã
return new Promise((resolve, reject) => {
function callback(err, result) { // f ã®ããã®ã«ã¹ã¿ã ã³ã¼ã«ããã¯
if (err) {
return reject(err);
} else {
resolve(result);
}
}
args.push(callback); // 弿°ã®æ«å°¾ã«ã«ã¹ã¿ã ã³ã¼ã«ããã¯ã追å
f.call(this, ...args); // å
ã®é¢æ°ãå¼ã³åºãã¾ã
});
};
};
// 使ç¨ä¾:
let loadScriptPromise = promisify(loadScript);
loadScriptPromise(...).then(...);
ã³ã¼ãã¯å¤å°è¤éã«è¦ãã¾ãããloadScript 颿°ã® Promise åããã¦ãããæ¬è³ªçã«ã¯ä¸ã§æ¸ãããã®ã¨åãã§ãã
promisify(f) ã®å¼ã³åºãã¯ãf (*) ã®ã©ããã¼ãè¿ãã¾ããã©ããã¼ã¯ promise ãè¿ããå¼ã³åºããå
ã® f ã«è»¢éããã«ã¹ã¿ã ã³ã¼ã«ãã㯠(**) ã§çµæã追跡ãã¾ãã
ããã§ãpromisify ã¯ãå
ã®é¢æ°ã¯2ã¤ã®å¼æ° (err, result) ãæã¤ã³ã¼ã«ããã¯ãæå¾
ãã¦ããåæã§ããããã¯ãã£ã¨ãããåºããããã¿ã¼ã³ã§ããããã¦ãã«ã¹ã¿ã ã³ã¼ã«ããã¯ã¯ã¾ãã«æ£ããå½¢å¼ã§ãããpromisify ã¯ãã®ãããªã±ã¼ã¹ã§ä¸æãæ©è½ãã¾ãã
ããããä»®ã«å
ã® f ãããå¤ãã®å¼æ° callback(err, res1, res2) ãæå¾
ãã¦ããã¨ãããã©ããªãã§ããããï¼
è¤æ°ã®ã³ã¼ã«ããã¯ã®çµæã®é
åãè¿ã promifify ã®ä¿®æ£ã§ã:
promisify(f)ãå¼ã°ããå ´åã¯ãä¸ã¨åæ§ã«åä½ãã¾ããpromisify(f, true)ãå¼ã°ããå ´åã¯ãã³ã¼ã«ããã¯ã®çµæé åã§ resolve ãã promise ãè¿ãã¾ãããããè¤æ°ã®å¼æ°ããã¤ã³ã¼ã«ããã¯ã«å¯¾ãããã®ã§ãã
// çµæã®é
åãå¾ãå ´å㯠promisify(f, true)
function promisify(f, manyArgs = false) {
return function (...args) {
return new Promise((resolve, reject) => {
function callback(err, ...results) { // f ã®ã«ã¹ã¿ã ã³ã¼ã«ããã¯
if (err) {
return reject(err);
} else {
// manyArgs ãæå®ããã¦ããå ´åããã¹ã¦ã®ã³ã¼ã«ããã¯çµæã§ resolve ãã¾ã
resolve(manyArgs ? results : results[0]);
}
}
args.push(callback);
f.call(this, ...args);
});
};
};
// 使ç¨ä¾:
f = promisify(f, true);
f(...).then(arrayOfResults => ..., err => ...)
ã覧ã®éããåºæ¬çã«ã¯ä¸è¨ã¨åæ§ã§ãããresolve 㯠manyArgs ã true ãã©ããã«ãã£ã¦ã1ã¤ã¾ãã¯ãã¹ã¦ã®å¼æ°ã§å¼ã³åºããã¾ãã
ã±ã¼ã¹ã«ãã£ã¦ã¯ãerr ã¯ã¾ã£ãããªãããããã¾ãã: callback(result), ã¾ããã³ã¼ã«ããã¯ã®å½¢å¼ãçãããããªå ´åã«ã¯ããã«ãã¼ã使ãããæåã§ãã®ãããªé¢æ°ãã¡ã Promise åããã®ãããã§ãããã
ããå°ãæè»ãª Promisification 颿°ãæã¤ã¢ã¸ã¥ã¼ã«ãããã¾ããä¾ãã°ães6-promisify ã§ããNode.js ã§ã¯ãçµã¿è¾¼ã¿ã® util.promisify ãããã¾ãã
Promisification ã¯ç´ æ´ãããã¢ããã¼ãã§ããç¹ã« async/await (次ã®ç« ã§èª¬æãã¾ã)ã使ãã¨ãã«ã¯ãã§ãããããã¯ã³ã¼ã«ããã¯ã®å®å
¨ãªç½®ãæãã«ã¯ãªãã¾ããã
è¦ãã¦ããã¦ãã ãããPromise ã¯1ã¤ã®çµæã®ã¿ãæã¡ã¾ãããã³ã¼ã«ããã¯ã¯æè¡çã«ã¯ä½åº¦ãå¼ã¶ãã¨ãã§ãã¾ãã
ãã®ãããPromisification ã¯ã³ã¼ã«ããã¯ã1度ã ãå¼ã¶é¢æ°ã®ã¿ã対象ã¨ãã¦ãã¾ãããã以éã®å¼ã³åºãã¯ç¡è¦ããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã