2015-12-28 64 views
0

我在不同的地方有功能(這是常用的功能,它會使用很多地方) 所以我試着用異步並行調用函數但是不工作 I附我的代碼如下:L節點js +異步並行+函數調用方法不起作用

var userId = 33; 

async.parallel({ 
     video(userId, callback) { 
      callback(null, callback); 
     }, 
     video1(userId, callback) { 
      callback(null, callback); 
     } 
    }, function(err, results) { 
     console.log(results); 
    }); 



    function video (userId, callback) { 
     client.query("select youtube_id,title,id,thumbnail,search_item from resource order by random() limit 1 ", function(err, video) { 
      callback(err, video); 
     }); 

    } 

    function video1(userId, callback) { 
      client.query("select youtube_id,title,id,thumbnail,search_item from resource1 order by random() limit 1 ", function(err, video1) { 
       callback(err, video1); 
      }); 

     } 
+1

這是無效的JavaScript。函數名稱:函數是什麼意思? –

+0

對不起,我已經像var videofunction = {video:function(){},video1:function(){...}};所以我複製了這些代碼並粘貼。現在我改變了 – RSKMR

回答

0

{fnName()}語法是一個函數聲明你想用一個函數調用......其實你也可以只使用async.parallel({video, video1}, (err, results) => console.log(results)來達到同樣的效果......除非你。還需要通過userId。所以你實際打算的是這個函數調用而不是它聲明:

async.parallel([ 
    callback => video(userId, callback), 
]); 
+0

我試着像下面這樣:** * async.parallel([callback = globaldetails.video(userId,callback), ],function(err,results){ console.log(err); console .log(results); }); \t ***但它不起作用 – RSKMR

0

你需要的功能的引用傳遞給async.parallel(),你需要傳遞一個數組,而不是一個對象。你想要的代碼有這樣的形式:

async.parallel([fn1, fn2], finalCallback); 

您要使用的語法的具體例子見async.parallel() doc here

fn1fn2finalCallback都是函數引用可以由async.parallel()基礎設施,而不是你自己叫什麼叫。

你的代碼改成這樣:

async.parallel([ 
    function(callback) { 
     client.query("select youtube_id,title,id,thumbnail,search_item from resource order by random() limit 1 ", function(err, video) { 
      callback(err, video); 
     }), 
    }, 
    function(callback) { 
     client.query("select youtube_id,title,id,thumbnail,search_item from resource order by random() limit 1 ", function(err, video1) { 
      callback(err, video1); 
     }); 
    } 
], function(err, results) { 
     console.log(results); 
}); 

想必,你的兩個數據庫查詢應該是不同的某種方式(你的代碼表明它們是相同的)。

如果你的函數已經定義在某處,那麼你可以傳遞一個匿名函數引用來調用它們。如果您的功能沒有async.parallel()需要的完全相同的調用約定,則需要執行此操作。你可以這樣做:

async.parallel([function(callback) { 
      video(userId, callback); 
     }, function(callback) { 
      video1(userId, callback); 
     }], function(err, results) { 
     console.log(results); 
}); 
+0

我期待答案,如何使用async.parrllel訪問函數值,因爲函數video和video1正在使用很多地方。 – RSKMR

+0

@RSKMR - 我已經添加了一個如何調用已經定義的函數的例子。您應該能夠從他們的文檔中的異步示例中看到這一點。 – jfriend00