KAEDE Hack blog

JavaScript 中心に ライブラリなどの使い方を解説する技術ブログ。

npm prompts と 即時(無名) 関数の役割

why

remark を理解するのに callback が必要になり、その MDN サンプルに prompt が出てきて、ググったら HTML Window ではなく npm/prompts が出てきて混乱した

でもせっかくだし便利そうだから使えるようになりたい

prompts とは

propmt ではなく prompts, 複数形。

www.npmjs.com

依存関係がなく、同期も非同期も使えるらしい。よくわからない。

prompt.js

const prompts = require('prompts');

(async () => {
  const response = await prompts({
    type: 'number',
    name: 'value',
    message: 'How old are you?',
    validate: value => value < 18 ? `Nightclub is 18+ only`: true
  });
  console.log(response);
})()

このコードを実行すると

node prompts.js 
✔ How old are you? … 100000
{ value: 100000 }
node prompts.js 
? How old are you? › 17
› Nightclub is 18+ only

こうなる。

非同期で type, name, msg, validate, を指定して prompts を実行できる。

無名関数として実行するためには最後の () が必須。

これがないと絶対に動かない。

function hoge() .... hoge() で実行するのと同じように () が exe なのかな?

また変数として今の無名関数を入れて、名前で実行するのもあり。

const howOld = (async () => {
  const response = await prompt({
    type: 'number',
    name: 'value',
    message: 'How old are you?',
    validate: value => value < 18 ? `Nightclub is 18+ only`: true
  });
  console.log(response);
})
howOld()

これでも動いた。

なお npm の公式ページでこれで試してね!って置いてある Runkit+ では非同期は?対応してない模様。じゃあリンク乗っけるなよ...

f:id:kei_s_lifehack:20210210010444p:plain

即時関数について

affi-sapo-sv.com

(function(){
    // 一連のJavaScriptのコードを全て記述
})();

これが即時関数らしい。

もともと WP では同じ名前の関数が乱立するため、いっその事名前のない関数ブロックを作ってしまえばと作られ、名前が干渉することはないが、名前がなくて後から呼び出すことはできないから即時実行せざるを得ないのだろう

はてなブログに投稿しました #はてなブログ 非同期とか関係なく

function 自体を () でラップしていても、その後に () を使うのは必要。

f:id:kei_s_lifehack:20210210011206p:plain

Runkit も即時関数自体は使えた。

即時関数 x 非同期

では非同期も追加してみよう

(async() =>{
    console.log('hello');
})();

これを実行すると

f:id:kei_s_lifehack:20210210011524p:plain

Promise (resolved)

で無事に実行されてしまった。

Runkit で Promise が無効化されているわけではなさそうだ。

Promise(pending) の時は

await が入っているからか...?

async のみでやるときと await が入る時は何が違うんだろう、非同期の勉強が必要か...

async await とは

qiita.com

async だけだと Promise を reslove して返すが、 なんかエラーの場合の処理もかける

その中のみ await が使えて、これは 包括されている async の 関数が resolve されるまで 動かないらしい。

Runkit で pending になっているのは async 部分が reject されてしまっているのか?

わからない