JavaScriptでasync/awaitに対応していない関数を対応させる

***************************************************
JavaScriptにコールバックの濫用が存在し、それがこのプログラミングのただなかに人為によって地獄をつくりあげ、神聖な安定性を不幸でもつれさせるかぎり-、またこの言語の三つの問題、すなわち、コールバックであるためにエラー処理が複雑化し、深いネストのために可読性が堕落し、エラーメッセージがよくわからないためにプログラマがいじけるという三つの問題が解決されないかぎり、-また、あるライブラリがasync/await対応によって有用性が増す可能性のあるかぎり、-言葉をかえれば、そしてもっとひろい見方をすれば、この地上に平易さを失った書き方の処理があるかぎり、このような性質の記事もまた役に立たなくはないだろう"

「レ・ミゼラブル」 - ヴィクトル・ユゴーより(嘘)

***************************************************

 Nodejsでサーバサイドをごにょごにょと書いている。XMLをJSオブジェクトにしたくてxml2js
というライブラリを入れたが、async/await対応していなかったっぽい。これのおかげで処理に一つコールバックが入ってしまった。これをasync/await対応して隠ぺいするお話。というかawaitできるようにするというところ。それをxml2jsを例にして書いていく。

 まず従来のコールバックなxml2jsの使い方。
parseString(xml, options, function (err, obj) {

if (err) {
throw err;
}

var items = [];

obj["rdf:RDF"].item.forEach(function (item, index, array) {
let doc = {
_id: item["sec:identifier"],
title: item["title"],
desc: item["description"],
link: item["link"],
issued: item["dcterms:issued"],
modified: item["dcterms:modified"],
};
items.push(doc);
});
});


 MongoDBにデータを入れたいのでXMLをオブジェクトにパースしたいのだけど、このまま書くならオブジェクト取得後の処理(加工、保存など)をコールバック関数の中に書かなければならない。parseStringをawaitして、オブジェクトを返してもらいたい。どうすればawaitを適用できる関数となるか。
 Promiseオブジェクトにしてしまう。これはちょっと進めると、Promiseオブジェクトを返す関数を書くのが一般的な様子。
function asyncParseString(xml) {

return new Promise(function (resolve, reject) {
const options = {
trim: true,
explicitArray: false
};
parseString(xml, options, function (err, obj) {
if (err) {
reject(err);
}

resolve(obj);
});
});
}

 resolveの引数で成功時の返り値を、rejectの引数でエラー時の値を渡す。
 あとはこの関数をawaitすればOK。
let obj = await asyncParseString(xml);

 受け取ったobjをこのあとごにょごにょしていけばいい。

まとめ
・async/await対応させたいライブラリがあったら、Promiseオブジェクトを使え

'18/2/24
async/awaitとPromiseがブラウザでも使えることを確認したのでタイトルを修正。XMLHttpRequestとかをこれでasync/await対応させてる話とかもある。

冒頭の文の元ネタ。
***************************************************
title: レ・ミゼラブル (1) (新潮文庫)
authors: ユゴー
社会に法律と風習による処罰が存在し、それがこの文明のただなかに人為によって地獄をつくりあげ、神聖な運命を人間の不幸でもつれさせるかぎり-、またこの世紀の三つの問題、すなわち、プロレタリアであるために男が落伍し、飢えのために女が堕落し、闇夜のために子どもがいじけるという三つの問題が解決されないかぎり、-また、ある地域で社会の窒息状態が生じる可能性のあるかぎり、-言葉をかえれば、そしてもっとひろい見方をすれば、この地上に無知と悲惨とがあるかぎり、このような性質の本もまた役に立たなくはないだろう。

***************************************************
comment: 0