2017-12-26 8 views
0

最近のバージョンのasync滝では、cbは利用できなくなったことを理解しています。loopbackJSのノードasync滝の結果を返す

そのような場合、リモートメソッドにどのように応答するのですか?私はこれをどこでも説明できるとは思わない。

非同期ドキュメントの例を使用する。

async.waterfall([ 
    function(callback) { 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback) { 
     // arg1 now equals 'one' and arg2 now equals 'two' 
     callback(null, 'three'); 
    }, 
    function(arg1, callback) { 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done' 

    // HOW DO I RETURN result TO THE CALLER OF THE REMOTE METHOD? 
    // HOW DO I RETURN result TO THE CALLER OF THE REMOTE METHOD? 
    // HOW DO I RETURN result TO THE CALLER OF THE REMOTE METHOD? 


}); 

EDIT:私が実際に応答を返そうとしている実際のイベントです。以前のバージョンの非同期では、これはcb()に渡すだけでしたが、これはもはやasyncでサポートされていないようです。

Ticket.addComment = function(id, comment, postedBy, cb) { 

    async.waterfall([ 

     //get ticket and add content 
     function(callback){ 
     Ticket.findById(id, function(err, ticket){ 
      ticket.ticketComments.create({ "body": comment }); 
      callback(null, ticket); 
     }); 
     }, 

     //update ticket isWith 
     function(ticket, callback){ 
     ticket.save(null, { 
      "id": ticket.id, 
      "isWith": postedBy 
     }); 
     callback(null,ticket); 
     } 

    ], function(err, ticket){ 

     // I NEED TO RETURN "ticket" TO THE METHOD CALLER.. THIS USED TO BE DONE BY PASSING "ticket" INTO cb(). 

    }); 

    } 

    Ticket.remoteMethod('addComment', { 
    http: { verb: 'post'}, 
    accepts: [ 
     {arg: 'id', type: 'string', description: 'ticket id of the ticket the comment is to be added to'}, 
     {arg: 'comment', type: 'string', description: 'the comment body'}, 
     {arg: 'postedBy', type: 'string', description: 'Who posted the comment'} 
    ], 
    returns: {arg: 'comment', root: true, type: 'application/json'} 
    }); 

答えて

0
var create = function (req, res) { 
     async.waterfall([ 
      _function1(req), 
      _function2, 
      _function3 
     ], function (error, success) { 
      if (error) { alert('Something is wrong!'); } 
      return alert('Done!'); 
     }); 
    }; 
    function _function1 (req) { 
     return function (callback) { 
      var something = req.body; 
      callback (null, something); 
     } 
    } 

    function _function2 (something, callback) { 
     return function (callback) { 
      var somethingelse = function() { // do something here }; 
      callback (err, somethingelse); 
     } 
    } 

    function _function3 (something, callback) { 
     return function (callback) { 
      var somethingmore = function() { // do something here }; 
      callback (err, somethingmore); 
     } 
    } 
0

短い答え:あなたはにはありません。これは非同期にプログラムする方法ではありません。

呼び出し元が非同期呼び出しを終了してその結果を取得する方法を工夫することは可能ですか?しかし、それを非同期的にプログラミングするという目的を破ることになります。

async.waterfallの結果を必要とするコードをお持ちの場合は、になります。最終コールバックに配置する必要があります。ここで

これは通常行われる方法の例:

Ticket.addComment = function(id, comment, postedBy, cb) { 

    async.waterfall([ 

    //get ticket and add content 
    function(callback){ 
     Ticket.findById(id, function(err, ticket){ 
     ticket.ticketComments.create({ "body": comment }); 
     callback(null, ticket); 
     }); 
    }, 

    //update ticket isWith 
    function(ticket, callback){ 
     ticket.save(null, { 
     "id": ticket.id, 
     "isWith": postedBy 
     }); 
     callback(null,ticket); 
    } 
    ], function(err, ticket){ 
    // Instead of returning to the caller, use your result here 
    Ticket.remoteMethod('addComment', { 
     http: { verb: 'post'}, 
     accepts: [ 
     {arg: 'ticket', type: 'whatever', value: ticket, description: 'an example of how you could return the result'}, 
     {arg: 'id', type: 'string', description: 'ticket id of the ticket the comment is to be added to'}, 
     {arg: 'comment', type: 'string', description: 'the comment body'}, 
     {arg: 'postedBy', type: 'string', description: 'Who posted the comment'} 
     ], 
     returns: {arg: 'comment', root: true, type: 'application/json'} 
    }); 
    cb(); // <-- not forgetting the callback 
    }); 

} 

:あなたのコードでメソッドTicket.findByIdticket.saveTicket.remoteMethodは同期に見えます。彼らは基本的にasync.waterfallを使用してコードを持っている目的を打ち負かしています:waterfall()の各機能はブロックされます。これらのメソッドの非同期バージョンが見つからない限り、非同期を完全に削除する必要があります。これは、コードをもっと複雑にするだけの大きなメリットはありません。

+0

こんにちはflaviodesousa ..はい、私は何かを返す必要があります。これは、チケットを更新するAPI呼び出しです。返されたチケットが必要です。最終コールバックに配置する必要があることを説明できますか?私はそれをやっていますが、API呼び出しに戻っていないようです。私は実際のイベントでチケットを更新し、私は応答を渡そうとしています。ありがとうございました – Jason

+0

非同期コードの外観の例を追加しました。 APIにはいくつかの問題がありますが、非同期には見えません。 – flaviodesousa

関連する問題