2017-11-14 6 views
2

あなたがすべてのリファクタリングとコールバックについて叫んで開始する前に、完全に、私はJavaScriptで次のような状況を持っている(私は他のオプションを持っていないときに...)

:)をしてください質問を読んで(便宜上簡略化したコード):

function myFunc(){ 
     var myItems = getItemsAsync(); //this returns a promise 

     return { 
      settings: { 
       type: "items", 
       component: "accordion", 
       items: myItems //WRONG! This is a promise, not the data itself! 
      } 
     } 
    } 

は、ここでの状況です:私はmyFuncを呼び出し、返されたオブジェクト{settings: etc...}itemsサブオブジェクトを含む、既に入力されたすべての値を、持っていることを期待外部のフレームワークを持っています。私はこのフレームワークがmyFuncをどのように呼び出すかを制御していないので、約束または部分的な結果を受け入れるように変更することはできません。

ここでわかるように、ここに問題があります:itemsを取得するには、私は非同期のAPIを呼び出す必要があり、約束を返します。残念ながら、このAPIも私のコントロール外です。したがって、同期して動作するようにこのAPIを変更することはできません。

基本的に私は膠着状態にあります:完全にオブジェクトを返す必要がありますが、そのオブジェクトの断片の1つは非同期的にしか取得できません!!

この問題を避ける方法はありますか?私がここで見てきた同様の質問はすべて、約束を待つことができないことを示唆しています...それは本当ですか?

"あなたはコール者かAPIのどちらかを変更する"と言いたいのは分かっていますが、残念ながらそれらは私のコントロールできない既存のシステムの一部であるため、変更する(理由は技術的ではなく官僚的な理由による)

これを解決するためのアイデアはありますか?

+0

この記事をチェックしてくださいhttps://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests – MysterX

+0

myFuncが非同期的に取得したものを返す必要がある場合、同期的に値を返すことはできませんmyFuncの呼び出し方法を変更する必要があります。非同期の結果を同期させる方法はありません。ちょっと考えただけで、なぜこれが不可能なのか分かりません。 –

+0

@JaromandaX:ポーリング/待っていなくても?申し訳ありませんが、これは愚かな音が、私はjavascriptの専門家ではない...なぜこれを行うことはできません? –

答えて

2

幸運にも私の質問で述べたフレームワーク(myFuncを呼び出したフレームワーク)は、私が望むように多くの約束事を注入できる初期化段階があり、フレームワークは先に進む前に完了し、myFuncを含む他のものを呼び出すので、この初期化フェーズ中に私のitemsオブジェクトを構築することができました。その後、使用する準備ができました。

これは私の元の質問に答えることはできませんので、私の問題を解決します。私はまだ誰かが回避策を知っているかどうかを確認するために数日待つだろうが、その間に私が読んだことから、私がしたいことはできないように見える。

1

あなたは既に答えを知っています:-)他のオプションがない場合は、にはオプションがありません。です。将来的に得られる価値をすぐに返すことは基本的に不可能です。

つまり、フレームワーク全体をファイバーなどで包むことができる場合は、呼び出し元の世界を停止させる可能性があるのはsome solutionsです。もちろん、システム全体の基本的な変更が必要ですが、フレームワークのコードを変更することなく行うことができます。しかし、これは若干のbugs due to unexpected timingを引き起こすかもしれません。

+0

興味深いことに、ファイバを私の注目に持ってくれてありがとう、私が同じような解決策で再び自分を見つけたら、便利です。幸運にも(私の答えを見てください)私はこれを「適切な」方法で解決することができましたが、情報のために+1してください。 –

関連する問題