問題タブ [node-fibers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - NPM パッケージを使用すると、「Meteor コードは常にファイバー内で実行する必要があります」というエラーが表示される
私はMeteor.require('npmPackage')
NPMパッケージを使用しています。ただし、npm パッケージのコールバック関数で mongo に書き込むとエラーが発生するようです。
エラー:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
コード
コードをファイバー内にラップしようとしましたが、同じエラー メッセージが引き続き表示されます。
質問:これを機能させるには、どのMeteor.bindEnvironment
ように使用すればよいですか?
node.js - Node.js、Synchronize.js および戻り値
私はこの素晴らしい同期モジュール synchronize.js を使用しています - http://alexeypetrushin.github.io/synchronize/docs/index.html。
同期された関数の戻り値をファイバーの外側のスコープに取得する必要がある状況に遭遇しました。これが私が話していることの基本的な例です:
一方records
、理論的にはresults
、ファイバー スコープ内の from の値が含まれます。私は先物(ファイバー/先物モジュール)とそれらがこの状況でどのように使用されるかについて調べてきましたが、まだ機能に近いものを思い付いていません. 方向性および/または解決策が欲しいです。
編集:
私が達成しようとしていることのより完全な例については:
ここでわかるように、私が達成したいことはresults
、ファイバーのスコープからプライマリ スコープの値を取得することです。
node.js - node.js でノードファイバーを使用すると、GC 中に V8 内で「致命的なエラー」が発生する
次のプログラムを実行すると、V8 によって報告される致命的なエラーが発生します。
それを実行するために使用されるコマンド:
致命的なエラーのテキストは次のとおりです。
次のバージョンを使用しています。
- ノード 0.10.25 x86 (VC2013 を
vcbuild x86 Debug
使用してビルド) - GitHub リポジトリから取得した node-fibers 1.0.1 (npmjs ではない)
アサーションの失敗はgc()
呼び出しの下で発生します。以下は、GC コールバックからfibers
ASSERT ステートメントまでのコール スタックです。
Release
この致命的なエラーは、nodeのバージョンでは発生しません。ただし、V8 エンジンが微妙に破損しているように見え、最終的にはコードのランダムな部分で少し失敗します。
現在、私が思いついた唯一の回避策は、ファイバーをリークして、このコードがヒットしないようにすることです。私は何か特に間違ったことをしていますか、それとも のバグfibers
ですか?
javascript - このエラーを修正するにはどうすればよいですか: エラー: ファイバーなしで待つことはできませんか?
私は、Fiber の使用から Meteor.bindEnvironment まで、考えられるすべてのことを試しました。どのようにコーディングしても、ある種のファイバー エラーが発生するか、変数がリセットされます。
私の最初の試み:コードをファイバーでラップしてみました:
そして、バインド環境を使用して試した2回目の試み:
最初の試みにはあらゆる種類の問題がありました。変数 bool は常に true にリセットされ、false に設定された後でも、break ステートメントが機能せず、item.title が未定義になることもありました。
var lastFeedInserted = Feeds.findOne();
2 回目の試行では、ファイバーに含まれていなかったため、エラーが発生しました。
私は基本的に、最後に挿入されたフィードを見つける必要がありitems.title
、タイトルがまったく同じではないことを確認するために をループしました。つまり、フィードはまだデータベースに保存されていません。そのため、while ループをループしている間、 の値はlastFeedInserted
変更されません。最後のlastFeedInserted.title
とitem.title
がまったく同じである場合は、ループから抜け出す必要があります。
どうすればこれを機能させることができますか?
javascript - Node.jsまたはJavascriptで非同期関数呼び出しを同期関数にラップする方法は?
関数を公開するライブラリを維持しているとしますgetData
。ユーザーは実際のデータを取得するためにそれを呼び出します:
var output = getData();
内部データはファイルに保存されるため、getData
Node.js 組み込み を使用して実装しますfs.readFileSync
。どちらも明らかでgetData
ありfs.readFileSync
、同期機能です。ある日、基になるデータ ソースを、非同期でのみアクセスできる MongoDB などのリポジトリに切り替えるように言われました。また、ユーザーを怒らせないようにと言われましたgetData
。API を変更して、単に promise を返したり、コールバック パラメーターを要求したりすることはできません。どうすれば両方の要件を満たすことができますか?
callback/promise を使用した非同期関数は、JavasSript と Node.js の DNA です。重要な JS アプリには、おそらくこのコーディング スタイルが浸透しています。しかし、この慣行は、いわゆるコールバック ピラミッド オブ ドゥームに簡単につながる可能性があります。さらに悪いことに、呼び出しチェーンのいずれかの呼び出し元のコードが非同期関数の結果に依存している場合、それらのコードもコールバック関数でラップする必要があり、呼び出し元にコーディング スタイルの制約が課せられます。大規模なグローバル リファクタリングを回避するために、非同期関数 (多くの場合、サード パーティのライブラリで提供される) を同期関数にカプセル化する必要があることに時々気付きます。この件に関する解決策を探すと、通常はノード ファイバーに行き着きます。またはそれから派生した npm パッケージ。しかし、ファイバーは私が直面している問題を解決することはできません. ファイバーズの著者が提供した例でさえ、欠陥を示しています。
実際の出力:
関数ファイバーが実際に非同期関数スリープを同期に変える場合、出力は次のようになります。
JSFiddleで別の簡単な例を作成し、期待される出力を生成するコードを探しています。Node.js でのみ機能するソリューションを受け入れるので、JSFiddle で機能していなくても、任意の npm パッケージを自由に要求できます。
meteor - Meteor.bindEnvironment を使用した Meteor.Collection
既にMeteor.binEnvironment内にある関数内で を実行する<collection>.find ({})
と、次のエラー メッセージが表示されます。throw new Error ('Can \' t wait without a fiber ');
Meteor.bindEnvironment(<collection>.find ({}))
throw new Error (noFiberMessage);
問題の関数は、Meteor.methods ({})
どこが間違っているのでしょうか?
エラーを再現する例:
javascript - このコンテキストをファイバーにバインドする方法は?
私は現在、M Laverdet ノードファイバーを試していますが、とても気に入っています。しかし、スコープの問題で立ち往生しています。誰かが何が起こっているのかを理解するのを手伝ってくれることを願っています.
ファイバーの "bind()" を実行するにはどうすればよいですか?