2016-11-21 22 views
-1

私は約束をよく知らないです。 promise-callからpromise-implementationを隠したいと思います。約束とは別にお約束します。

例:私はこの約束を呼び出す

function findFriends(req, res) { 

    const promiseFriend = MyFriendes.find({}).exec(); //call promise 

    if(friends.length===0){ 
     logger.warn('No friendsavailible'); 
    }else if(friends === undefined){ 
     res.status(500).json({ 
      error: 'INTERNAL ERROR' 
     }); 
    }else{ 
     res.status(200).json({ 
      friends: friends 
     }); 
    } 
} 

と私は同じファイル内の私の約束を解決しますが、同じ機能ではありません 、。

promiseFriend 
     .then(function(friends){ 
      return friends; 
     }) 
     .catch(function(err){ 
      logger.error({error:err}); 
     }); 

ここで、「promiseFriend」は定義されていません。 promise-callとpromise-resolutionをどのように分けることができますか?

+0

もっとコードを投稿できますか?どこで 'findFriends'と呼んでいますか?そしてどこを正確に約束していますか? 私は約束を伝えることができます - あなたのコードのどこかで 'then'を呼んでいない限り、約束は解決されません。そして、解決の後、あなたはあなたが望むように同じ回数 ''を呼び出すことができ、同じ値を返します(既に解決されています)。 promiseFriendが定義されていないことは、約束とは何の関係もありません。約束を呼んでいる場所では、この変数は定義されていません。 – SzybkiSasza

答えて

3

関数内で約束を定義し、それを他の場所で使用したい場合は、まずその関数から約束を返す必要があります。これはコードで実行していません。次に、実際にあなたがしていない機能を呼び出す必要があります。最後に戻り値にthenコールバックを使用する必要がありますが、この場合も同様です。

約束事をローカル変数promiseFriendに保存することは、この機能の有効範囲にはありません。 thenコールバックに値を返す必要もありません。.then(function (friends) { return friends; }) - ここで何をしようとしたか分かりません。

findFriendsがExpressのルートハンドラであると仮定します。その場合は、すべてのケースで応答を送信するようにしてください(friends.length===0の場合は実行しないでください)。また、解決されたときに処理したい場合は、実際にthenハンドラを保存した約束に追加する必要があります。今ではあなたの機能にfriendsが定義されていません。 catchハンドラを追加し、そのケースに対する応答も送信します。

次に、あなたの関数から約束を返すかもしれませんが、それがルートハンドラであれば意味がありません。

function x() { 
    return MyFriendes.find({}).exec(); 
} 

し、それを使用します:あなたは、関数からの約束を返すことができ

x().then(friends => ...).catch(error => ...); 

しかし、あなたはそれを返さない場合は、戻り値を使用することはできません、あなたがよう、未定義の変数を使用することはできませんそれらが定義されていれば、実際にあなたの戻り値が返される人を考慮する必要があります。

いくつかのランダムなコードをコピーして貼り付けて、実際にそれを理解しようとせずに望むことを期待しているように見えるので、Nodeの実際の仕組みを学ぶことをお勧めします。

は、ここで、この実行順序を与えているノードの非同期性のより良い理解を得るためには、それらの回答を参照してください。

ノードprogを書き込もうとしないでください。あなたが関数呼び出し、戻り値、コールバックの概念を理解する前に、この場合はラムを呼び出します。

+0

thx。説明のために。私は約束の簡単な例を見ただけですが、私がもっと複​​雑になるときは、どのようにデザインすることができますか。 –