3

node.jsのモジュールであるjsdomで遊んでいます。下部にある次のコードは、ドキュメント ページからのものです。私の問題は、非同期関数から何かを返す方法です。

これはよく聞かれる質問であることは知っています。おそらく私もそうです。また、この種の問題に関しては、コールバックが良い友達であることも知っています。ここでの私の目標は、PHP の Cookie またはセッション変数のように機能する可能性のある回避策を見つけて、その小さなデータを非同期関数の外の外側のスコープに転送することです。次に、データが外側のスコープから設定されると、アクセスできるようになります。

私が最初に知りたいのは:

  1. 外部スコープに存在し、必要なことを完了したらアクセスできるCookie やセッションのような場所にデータを保存する方法は既にありますか?
  2. コードのポイントBでデータをファイルに書き込み、ポイントCでそれを読み取る場合、ファイルを読み取る前に数秒間待機するために、ある種のタイムアウト関数を作成する必要はありませんか? nodejs で非同期関数を操作した経験から、書き込みプロセスが完了するまで数秒待たなければならないことが時々ありました。ここもそうなのだろうか。はいの場合、データを保存した場所がメモリである場合、それが発生する必要があるということではないでしょうか?
  3. この目的のために C++ プラグインを作成する場合、それは別のデータ ベイsave(data)として機能し、ポイントBでメモリにretrieve(data)、ポイントCでメモリからアクセスできます。これは機能しますか?

正直なところ、非同期関数を回避するために一時ファイルを作成するのは好きではありません。データを渡すためのシンプルで効果的な方法を探していましたが、この問題に対する不必要なアプローチを克服するには、あなたのような経験豊富なプログラマーからのガイダンスが必要です.

何がうまくいき、何がうまくいかないかを述べて、私のためにいくつかのアイデアを投げかけていただければ幸いです.

コード例は次のとおりです。

// Print all of the news items on hackernews
var jsdom = require("jsdom");
// var result; 
// A) Outer Scope: Since the function is async in done, storing the result here and echoing in point C is pointless.
jsdom.env({
  html: "http://news.ycombinator.com/",
  scripts: ["http://code.jquery.com/jquery.js"],
  done: function (errors, window) {
    var $ = window.$;
    console.log("HN Links");
    $("td.title:not(:last) a").each(function() {
      console.log(" -", $(this).text());
    });
    // B) let's say I want to return something I've scavenged here.
    // result = $("a");
  }
});
// C) 
// console.log(result)
4

2 に答える 2

3

データベース操作、ファイル IO、ネットワーク データの取得、長い計算など、実行をブロックする可能性がある場所では同期コードを使用しないでください。例では、計算を終了して実行を続行するときにコールバックを使用します。また、毛深い呼び出しの事実上の標準であるasync https://npmjs.org/package/asyncライブラリも見てください。

    function sendData(result) {
        res.json(result);
    }

    var jsdom = require("jsdom");
    // var result;
    // A) Outer Scope: Since the function is async in done, storing the result here 
    // and echoing in point C is pointless.
    jsdom.env({
        html: "http://news.ycombinator.com/",
        scripts: ["http://code.jquery.com/jquery.js"],
        done: function (errors, window) {
            var $ = window.$;
            console.log("HN Links");
            $("td.title:not(:last) a").each(function () {
                console.log(" -", $(this).text());
            });
            // B) let's say I want to return something I've scavenged here.
            var result = $("a");
            sendData(result);
        }
    });
于 2013-05-26T07:57:44.507 に答える