2013-04-01 163 views
2

mongoosejs異步代碼。等待異步完成後返回

userSchema.static('alreadyExists',function(name){ 
    var isPresent; 
     this.count({alias : name },function(err,count){ 
     isPresent = !!count 
     }); 
    console.log('Value of flag '+isPresent); 
    return isPresent; 
}); 

我知道this.count異步函數調用回調之前,因此其價值是不確定的返回isPresent。但我如何等待回調改變isPresent的值,然後安全地返回?

(function(){ asynccalls() asynccall() })();在異步流程中有什麼影響。 如果var foo = asynccall() or (function(){})() 會發生什麼情況上面兩個返回等待嗎?

可以process.nextTick()有幫助嗎?

我知道有很多這樣的問題,但沒有任何關於異步完成

回答

2

之前返回的問題解釋有沒有辦法做到這一點。您需要更改函數的簽名以進行回調,而不是返回值。

使IO異步是Node.js的主要動機之一,並等待異步調用完成失敗的目的。

如果你給我更多關於你想要實現的內容,我可以給你指示如何用回調來實現它。

編輯:你需要的東西像下面這樣:

userSchema.static('alreadyExists',function (name, callback) { 
    this.count({alias : name}, function (err, count) { 
     callback(err, err ? null : !!count); 
     console.log('Value of flag ' + !!count);  
    }); 
}); 

然後,你可以用它喜歡:

User.alreadyExists('username', function (err, exists) { 
    if (err) { 
     // Handle error 
     return; 
    } 

    if (exists) { 
     // Pick another username. 
    } else { 
     // Continue with this username. 
    } 
} 
+0

alreadyExists是一個函數,它檢查用戶給出的別名是否已經存在於db中,如果存在,他會得到一個備註來選擇另一個。 –

+0

如果他們想要檢查db中的某些內容,然後根據結果繼續,可以做些什麼? –

+0

感謝您的更新! 。這清除了很多東西,特別是它有多糟等待以及我對回調權力的無知 –

0

有同樣的問題。我希望我的摩卡測試運行速度非常快(正如他們原來那樣),但同時在我的應用程序中存在並運行反DOS層。正如他們原來的工作一樣運行這些測試是瘋狂的快速和我使用的ddos模塊開始響應太多的請求錯誤,使測試失敗。我不想僅僅爲了測試目的而禁用它(我實際上希望有自動化測試來驗證「太多請求」情況也在那裏)。

我有一個地方用於爲HTTPS請求準備客戶端的所有測試(填充正確的標頭,通過身份驗證,使用cookie等)。它看起來像這樣或多或少:

var agent = thiz.getAgent(); 
thiz.log('preReq for user ' + thiz.username); 
thiz.log('preReq for ' + req.url + ' for agent ' + agent.mochaname); 

if(thiz.headers) { 
    Object.keys(thiz.headers).map(function(header) { 
     thiz.log('preReq header ' + header); 
     req.set(header, thiz.headers[header]); 
    }); 
} 
agent.attachCookies(req); 

,所以我想注入有睡眠會在每5次請求通過測試該客戶端執行的請求踢 - 所以整個套件將很快運行,每第5個請求都會等待ddos模塊考慮我的請求由於太多的請求錯誤而不能被禁止。

我搜索了大部分有關異步和其他庫或實踐的條目。他們都需要回調 - 這意味着我將不得不重新編寫幾百個測試用例。

最後,我放棄了任何優雅的解決方案,並墮落到爲我工作的人。這是添加for循環試圖檢查不存在的文件的狀態。它導致一個操作被執行足夠長的時間,我可以校準它持續大約6500毫秒。

for(var i = 0; i < 200000; ++i) { 
    try { 
     fs.statSync('/path' + i); 
    } catch(err) { 
    } 
};