2016-06-06 59 views
-1

我正在嘗試創建一個鉤子,其中我根據響應循環每個結果,根據當前對象查找用戶並將其作爲另一個屬性附加到最終響應。然而,異步調用不讓我發出正確的響應:從for循環內的回調函數中附加數據Loopback

Board.afterRemote('find',function(context,boards,next){ 
    var users = []; 
    context.result.admin =[]; 
    var User = app.models.User; 


    context.result.forEach(function(result){ 
     User.findOne({where:{id:result.adminId}},function(err,user){ 
     result.admin = user; 
     }); 

    }); 
    console.log("result: "+JSON.stringify(context.result)); 
    next(); 

    }); 

我如何能夠將用戶添加到在context.result每個結果?

回答

1

User.findOne和異步操作?如果是這樣,我會建議使用異步控制流庫如async來遍歷結果並對每個項目執行異步操作。它看起來像這樣:

Board.afterRemote('find',function(context,boards,next){ 
    async.each(context.result, function(result, callback) { 
     User.findOne({where:{id:result.adminId}},function(err,user){ 
      result.admin = user; 
      callback(err) // Done with this iteration 
     }); 
    }, function(err) { // Called once every item has been iterated over 
     console.log("result: "+JSON.stringify(context.result)); 
     next(); 
    }); 
}); 
+0

Thanka的答案!發現確實是異步操作。我還有一個問題。我還需要在afterRemote回調結束時調用next()函數嗎?或者只是在async.each()的cb中是必要的? –

+0

async.each完成後,您會想調用'next'。傳遞給迭代器的回調讓異步知道這個迭代已完成。一旦所有的迭代完成了你傳遞給async.each的回調函數。那就是你接下來要調用的地方,因爲那是所有迭代都完成的時候。 'async.each(collection,iterator,callback)'我已經更新了答案以顯示它在'afterRemote'回調中的樣子。 – carebdayrvis

+0

非常感謝! –