問題タブ [bluebird]
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.
javascript - fs と bluebird の約束
私は現在、nodejsでpromiseを使用する方法を学んでいます
そのため、私の最初の課題は、ディレクトリ内のファイルを一覧表示し、非同期関数を使用して両方のステップでそれぞれのコンテンツを取得することでした。私は次の解決策を思いつきましたが、これがこれを行うための最もエレガントな方法ではないと強く感じています。特に、非同期メソッドをプロミスに「変換」している最初の部分です。
次に、両方の promise をチェーンします。
上で書いたように、それは望ましい結果を返しますが、これにはもっとエレガントな方法があると確信しています。
node.js - ネストされたプロミスから値を返す方法は?
Redis には映画の ID の [1,2,3,4]
セットと、実際のデータを含むハッシュのセットがあります。ここで、ID のすべての動画データを一度に取得したいと考えています。
ブルーバードの約束を使おうとしていますが、行き詰まりました。これまでのところ、私は持っています:
問題は、すべての操作が完了した後、JSON に興味があるだけなのに、常に新しい約束を返すことです。
ここにいる誰もがこれに光を当てることができますか?
javascript - promise のマップされた配列を生成しても何も返されない
フラグで実行されているbluebird
ノードで promise ライブラリを使用しています0.11.9
--harmony
私は簡単な実例を持っています:
これは正常に機能し、ノードの統計のリストを出力します。しかし、次のバージョンでは: 出力はまったくありません:
なぜこれがうまくいかないのですか?
javascript - 並列プロミスの流動的な構築
私の質問は、 Promiseを構築する関数にコンテキストと引数の両方を渡す必要がある場合の、 BlueBirdでの Promise のエレガントな並列化についてです。
私の問題を理解し、テストできるようにするために、依存関係のない例を作成しました。
計算 ( 1/(x x x) + 1/(x*x) ) を非同期の「コンピューター」 (リソースを解放する必要があります) で行うとします。正方形と立方体は、非同期で独立して計算されます。
私はこのように私の計算を行うことができます:
しかし、all
理論的に可能なものと比較して、この使用法は重すぎると思います。関数を引数として に渡すと、その関数がthen
実行されます。関数を に渡すとall
、そうではなく、エラーが発生します。ユーティリティまたはパターンが不足していると思われます...
このスタイルでよりシンプルなものに変更する解決策はありますか:
?
Promise.prototype.allをハックするか、ポリモーフィズムの増加を避けるために新しい関数を定義することもできますが、所有していないオブジェクトの変更を含まないソリューションにのみ関心があります。
附属書:
テスト用の「コンピューター」を定義する方法は次のとおりです。
javascript - 同期プロミスの解決 (bluebird と jQuery の比較)
Dynamics CRM REST/ODATA Web サービス (CrmRestKit)用の小さなライブラリを開発しました。lib は jQuery に依存し、jQuery の promise-like-pattern である promise-pattern を利用します。
今、私はこのライブラリをbluebirdに移植し、jQuery の依存関係を削除したいと考えています。しかし、bluebird は promise オブジェクトの同期解決をサポートしていないため、問題に直面しています。
いくつかのコンテキスト情報:
CrmRestKit の API は、Web サービス呼び出しを同期モードまたは非同期モードで実行する必要があるかどうかを定義するオプションのパラメーターを除きます。
「true」を渡すか、最後のパラメーターを省略すると、メソッドはレコードを同期して作成します。モード。
場合によっては、同期モードで操作を実行する必要があります。たとえば、フォームの保存イベントに関与する Dynamics CRM の JavaScript コードを記述し、このイベント ハンドラーで検証のために同期操作を実行する必要があります (たとえば、特定の数の子レコードが存在することを検証し、適切な数のレコードが存在する場合は、保存操作をキャンセルしてエラー メッセージを表示します)。
私の問題は次のとおりです。bluebird は同期モードでの解像度をサポートしていません。たとえば、次のようにすると、「then」ハンドラーが非同期で呼び出されます。
出力は次のとおりです。
promise は既に値で解決されているため、「second」は「first」の後に表示されると予想されます。したがって、既に解決された promise-object に適用されると、 then-event-handler がすぐに呼び出されると想定します。
jQuery を使用して同じことを行うと (既に解決されたプロミスで使用)、期待どおりの結果が得られます。
これにより、次の出力が生成されます。
ブルーバードを同じように機能させる方法はありますか?
更新: 提供されたコードは、問題を説明するためのものです。lib の考え方は次のとおりです。実行モード (同期、非同期) に関係なく、呼び出し元は常に promise オブジェクトを処理します。
「... ユーザーに尋ねる...意味がないようです」について: 「CreateAsync」と「CreateSync」の 2 つのメソッドを提供する場合、操作の実行方法を決定するのもユーザー次第です。
とにかく、現在の実装では、デフォルトの動作 (最後のパラメーターはオプション) は非同期実行です。したがって、コードの 99% は promise-object を必要とします。オプションのパラメーターは、単に同期実行が必要な 1% のケースでのみ使用されます。さらに、私は自分で lib を開発し、99,9999% のケースで async モードを使用していますが、必要に応じて sync-road に移動するオプションがあると便利だと思いました。
しかし、同期メソッドは単に値を返す必要があるという点は理解できたと思います。次のリリース (3.0) では、「CreateSync」と「CreateAsync」を実装します。
ご意見ありがとうございます。
Update-2 オプションのパラメーターの意図は、一貫した動作を保証し、論理エラーを防ぐことでした。libを使用する私の方法「GetCurrentUserRoles」の消費者としてあなたを想定してください。したがって、メソッドは常にプロミスを返します。つまり、結果に依存するコードを実行するには、「then」メソッドを使用する必要があります。したがって、一部の人がこのようなコードを書くとき、私はそれが完全に間違っていることに同意します:
メソッド「GetCurrentUserRoles」が同期から非同期に変更されると、このコードが壊れることに同意します。
しかし、これは良い設計ではないことは理解しています。なぜなら、消費者は非同期メソッドを扱う必要があるからです。
javascript - ブルーバードは複数の引数を約束します
Promises は初めてで、この問題を解決する方法がわかりません。認証システムを実行しています。最初の呼び出しは、データベースで電子メールをチェックすることです。ユーザーが存在する場合は、パスワードを bcrypted パスワードと照合します...私はこの lib を bcrypt に使用しています: https : //npmjs.org/package/bcrypt は約束と互換性がないため、「promisify」を使用しています次の署名: compare(password, crypted_password, callback)。
これは私のコードです:
これは私の findByEmail メソッドです:
}
その場合、「比較」メソッドに複数の値を割り当てる方法は? 私は約束のポイントを逃していますか?
javascript - ブルーバード、約束、そして()
bluebird を使ってまだ数日しか経っていませんが、古いコードをすべて見直してみたいと思いますpromisify
:)
then()
私の問題は、コマンドの流れをまだ完全に把握していないことです。
次の 2 つのブロックを検討してください。
あ
B
シナリオ A では、 ?
task3
の結果が得られます。task2
B では、最初の約束の結果が得られますか?Promise.all
2 番目のものは、 bluebirdからの実行とどう違うのですか?Promise.all
メソッドの使用に関して、これらのA / B /はどのように異なりますcatch
か(どこに置くか)。
まとめての質問ですみません。
node.js - bluebirdを使用してnodejsですべての約束が完了するのを待ちます
bluebirdを使用してnodejsですべての約束が完了するのを待つ最良の方法は何ですか? データベースからレコードを選択し、それらを redis に保存したいとしましょう。私はこれを思いついた
期待どおりに機能しているかどうかはわかりません。すべてのエントリは redis にありますが、console.log には空の配列が表示されます。約束を果たした後にredisが返すメッセージであるため、「OK」の配列を含めるべきではありませんか? ここで何が欠けていますか?