ピューターの操り人形- Part 2
5808 ワード
TLドクターHere's the GitHub repo.
このシリーズの前の記事では、私はPureScript
本稿では、そのコードがJS層にどのようにリンクするかを調べたい.PureScriptには、開発者がpureScript層で厳密にタイプされた関数として解釈されるバニラJSで関数を書くのを許す簡単なffiがあります.JS関数を入力する際にエラーを防ぐものはありませんが、
ブラウザの起動
Chromeバイナリを取得し、ブラウザを起動する関数のpurescriptコードを見てみましょう.コードは
JSを見せてください!
これを可能にするために使用される関数は
それで、我々が本当にこれを混乱させる2つの方法だけがあります: JSから間違ったタイプを返すこと. JSにおいて意図的にエラーを誘発する PureScriptプログラムでは、これらはバグの最も一般的な源です、しかし、インターフェースが本当にきれいであるので、彼らは簡単にスポッタブルです:それは、いつも呼ばれるファイルに移されるいくつかのモジュールにあります
約束する約束.
上記の関数の場合、
では、タイプシステムが一貫した非同期コンテキストの使用を強制する方法について話します.
このシリーズの前の記事では、私はPureScript
Aff
-sは、AWS ServerlessでPantpeteerを走らせるような複雑な非同期ワークロードを編成します.本稿では、そのコードがJS層にどのようにリンクするかを調べたい.PureScriptには、開発者がpureScript層で厳密にタイプされた関数として解釈されるバニラJSで関数を書くのを許す簡単なffiがあります.JS関数を入力する際にエラーを防ぐものはありませんが、
Effect
モナド.見てみましょう.ブラウザの起動
Chromeバイナリを取得し、ブラウザを起動する関数のpurescriptコードを見てみましょう.コードは
Main.purs
.type EPromise a
= Effect (Promise a)
foreign import executablePath_ :: EPromise String
executablePath = asAff executablePath_ :: Aff String
type LaunchBrowser_
= String -> EPromise Browser
foreign import launchBrowser_ :: LaunchBrowser_
launchBrowser = asAff launchBrowser_ :: Affize LaunchBrowser_
これらの関数にはいくつかのことがあり、そのうちのいくつかは次の記事の主題になります.この記事では、我々は海外の宣言に焦点を当て、JS層でどのように実装されているかを示します.JSを見せてください!
これを可能にするために使用される関数は
Main.js
.var chromium = require("chrome-aws-lambda");
exports.executablePath_ = function() {
return chromium.executablePath;
};
exports.launchBrowser_ = function(executablePath) {
return function() {
return chromium.puppeteer.launch({
args: chromium.args,
defaultViewport: chromium.defaultViewport,
executablePath: executablePath,
headless: chromium.headless,
ignoreHTTPSErrors: true,
});
};
};
具体的には、二つを比較しましょうexecutablePath_
-s .注意すべき点は、executablePathRangeが型の値であっても、purescriptは関数を返すことですEffect (Promise String)
(EPromise
上で定義されているヘルパー型).プルーフでEffect a
として実装する必要がありますfunction () { return a }
JavaScriptで.これはEffect
Monadは常に副作用やエラーが発生する可能性があります(JavaScriptは安全で、副作用がいっぱいで、ハードドライブに書き込むような)ので、すぐに実行を避けるために関数をラップします.これにより、安全で純粋な方法で安全でない(不正な)コードを推論することができますIO
Haskellのモナドそれで、我々が本当にこれを混乱させる2つの方法だけがあります:
foreign.js
. しかし、これらのJS相互作用機能の表面積は非常に小さい(通常、上の関数のように、いくつかの線の順序で)、バグがある可能性は、JSまたはTSで書かれたプログラム全体よりもはるかに小さい.約束する約束.
上記の関数の場合、
Promise
-S . Purescriptは約束が何であるか全くわからないAff
-それで、それは不透明なブログのような約束を扱います、そして、幸せにそれを次の消費者に渡しますAff
.では、タイプシステムが一貫した非同期コンテキストの使用を強制する方法について話します.
Aff
, ですから、約束、コールバック、async/wait、バニラコードを調整する必要はありません.Reference
この問題について(ピューターの操り人形- Part 2), 我々は、より多くの情報をここで見つけました https://dev.to/mikesol/piloting-puppeteer-with-purescript-part-2-jjoテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol