2017-03-10 146 views
1

我有一個nodejs應用程序,它具有處理用戶的快速API併爲Web應用程序啓動http請求。爲一個用戶創建連續的nodejs功能

如何根據每個用戶制定特定功能的順序執行?即來自一個用戶的隊列呼叫,但具有並行排隊的另一用戶的呼叫

這是否有意義?

我發現了很多排隊調用的庫 - 或者在時間基礎上限制了請求。我如何在用戶的基礎上去做這件事?


EDIT

實施例:我已登錄的用戶2。大約需要3-5秒,以充分執行myFunction的( '一些HTTP請求')

  1. USER1調用myFunction的() - >被立即執行

  2. user2的調用myFunction的() - >被立即執行

  3. 當第一次調用仍在處理時,用戶2再次調用myFunction() - >調用將排隊,直到第一次調用完成。因此,像myFunction的()。然後,()

+0

也許我失去了一些東西..你能給一個例子嗎?另外你爲什麼要去同步?這條路線沒有優勢。如果你試圖調用一個同步的函數,你可以調用Promise – georoot

+2

裏面的每個用戶都有一個隊列嗎? – Ygg

+0

聽起來就像你在* sequential *中同步*一樣。排隊呼叫仍然是異步的。請編輯您的問題(標題,正文和標籤)以澄清。 – Bergi

回答

0

不要過分複雜化的東西,你可以使用 'async' 模塊的 'AUTO' 功能。

如果您將併發(int值)傳遞給它,它將並行運行該數量的任務(最多)。在我們的例子中,我們傳遞1以便特殊用戶按順序執行函數。 如果您沒有傳遞任何價值,它將盡可能多的運行並行任務。

'use strict'; 
 

 
const async = require('async'); 
 
const _ = require('lodash'); 
 

 
//Async function 
 
const myFunction = function (data, cb) { 
 
\t setTimeout(() => { 
 
\t \t console.log(data); 
 
\t \t cb(null); 
 
\t }, _.random(1, 1000)); 
 
}; 
 

 
//Do your logic to understand if the user is 'special' 
 
//So we call the functions sequentially 
 
let isSpecialUser = false; 
 

 
//Allow only one in parallel if this is a special user 
 
//else - allow as much as possible 
 
let concurrency = isSpecialUser ? 1 : null; 
 

 
async.auto(
 
\t [ 
 
\t \t cb => myFunction('First', cb), 
 
\t \t cb => myFunction('Second', cb), 
 
\t \t cb => myFunction('Third', cb), 
 
\t ], 
 
\t concurrency, 
 
\t() => { 
 
\t \t console.log('All done'); 
 
\t \t //Do needed stuff here, all calls are done 
 
\t \t //(sequentially or in parallel depending on a user) 
 
\t } 
 
);