2017-01-10 1 views
0

私はsails.jsフレームワークでnode.jsとasyncを使用しています。 データの配列に対していくつかの非同期DB操作を実行する関数を作成しようとしていますが、非同期の結果を親関数に返す簡単な方法を見つけ出すのに問題があります。 は、ここに私のコードです:別の関数内での非同期の使用

convertProductfields: function (articlesFromAurelia){ 

    async.each(articlesFromAurelia, function (post, cb) { 
     Categories.find({name: post.Categoria}) 
     .then(function(category){ 

      post.cat_id = category[0].cat_id;    
      cb(); 
     }) 
     .fail(function(error){ 
      cb(error); 
     }) 
    }, function(error){ 
     if(error) return res.negotiate(error); 

     sails.log.debug('articlesFromAureliaModified ' , articlesFromAurelia); 
     return articlesFromAurelia; 
    }); 

    sails.log.debug('articlesFromAureliaNotModified ' , articlesFromAurelia); 
    return articlesFromAurelia; 
} 

もちろんの問題は、コードの実行順序です。私の関数は、Async操作の結果が利用可能なときにすでに返されています。ありがとう!!

+0

は、最後の2行を削除し、上記の関数を使用します。 'convertProductfields'にコールバックを渡します –

答えて

1

ノード6.0を使用すると、ビルドされたプロミスが使用できます。

convertProductfields: function (articlesFromAurelia){ 

    var allPromises = articlesFromAurelia 
         .map(post => new Promise((resolve, reject) => { 
           Categories.find({name: post.Categoria}) 
           .then((category) => resolve(category)) 
           .fail((error) => reject(error)) 
           })); 
    return Promise.all(allPromises); 
} 

そして

convertProductfields(articlesFromAurelia) 
    .then(() =>{ 
     //handle success 
    }).catch(() => { 
     //handle error 
    }) 
0

あなたのお役に立てば幸いです。

convertProductfields: function (articlesFromAurelia, callback){ 

    async.each(articlesFromAurelia, function (post, cb) { 
    Categories.find({name: post.Categoria}) 
     .then(function(category){ 
     post.cat_id = category[0].cat_id; 
     cb(); 
     }) 
     .fail(function(error){ 
     cb(error); 
     }) 
    }, function(error){ 
    if(error) 
     return callback(null); //incase of error, return null 

    sails.log.debug('articlesFromAureliaModified ' , articlesFromAurelia); 
    return callback(articlesFromAurelia); //return updated articles 
    }); 
} 
関連する問題