2012-09-26 80 views
0

我仍然在學習節點編程....我正在使用express構建一個web應用程序,並且想要圍繞基於事件的非阻塞I/O包圍從其他嵌套回調函數在其他回調中。在節點中處理回調

這裏是我想了解關於使用回調無處不一個問題:

我不能這樣做在大多數情況下(crypo將使這種方法工作同步所以這個例子是確定):

user.reset_password_token = require('crypto').randomBytes(32).toString('hex'); 

我不得不去這樣做之前,我看到上面的示例工作:

User.findOne({ email: req.body.username }, function(err, user) { 

    crypto.randomBytes(256, function(ex, buf) { 
    if (ex) throw ex; 
    user.reset_password_token = buf.toString('hex'); 
    }); 

    user.save(); // can I do this here? 

    //will user.reset_password_token be set here?? 
    // Or do I need to put all this code into the randomBytes callback... 
    //Can I continue programming the .findOne() callback here 
    // with the expectation that 
    //user.reset_password_token is set? 
    //Or am I out of bounds...for the crypto callback to have been called reliably. 
}); 

如果我叫user.save()的randomBytes代碼之後(不是內它的回調)令牌總是被設置?

回答

1
//will user.reset_password_token be set here? 

號在你的例子中,調用crypto是異步完成的,這意味着執行將不會停下來讓該呼叫完成而會繼續你的findOne方法中執行代碼。

User.findOne({ email: req.body.username }, function(err, user) { 

    crypto.randomBytes(256, function(ex, buf) { 
    if (ex) throw ex; 
    user.reset_password_token = buf.toString('hex'); 

    // only within this scope will user.reset_password_token be 
    // set as expected 
    user.save(); 
    }); 

    // undefined since this code is called before the crypto call completes 
    // (at least when you call crypto async like you have) 
    console.log(user.reset_password_token); 
}); 
+0

請您描述正確的方式來處理這種情況嗎? (也就是說,如果函數不允許同步行爲爲randomBytes)。 –