簡體   English   中英

為什么在節點中B在A之前執行?

[英]Why is B executed before A in node?

router.get('/xyz', function(req, res, next) {
  var myObj;

  XX.getXXByUsername("ee", function(err, doc){
    console.log("A: " + doc); //executes second, doc is object that I want

    myObj = doc; 

  });

  console.log("B: "+ " " + myObj); //executes first, myObj = undefined

  res.render("pr", {title: "XX", myObj: myObj});
});

基本上,我這樣做是因為我想將對象發送到玉模板。 我可以在A控制台中獲取對象,但是在B控制台中myObj是未定義的。 我猜這是因為B控制台在getXXbyUsername之前執行,因為在getXXbyUsername回調中定義了myObj。

我不知道我是否解釋了我的問題,但是我是初學者,這是我可以給出的最好的解釋。

Node js異步執行代碼。 在執行代碼時,如果節點遇到需要花費一些時間才能執行的任務,則它會在完成此任務之前繼續執行下一行代碼。 這種模式不同於PHP之類的語言。 在您的代碼中, XX.getXXByUsername是一項數據庫操作,這很耗時。 因此它進入console.log("B: "+ " " + myObj); 在完成數據庫操作之前,因此未定義muObj。 解決此問題的一種方法是使用回調函數。 在節點js中,對於每個函數,都將回調作為參數傳遞,並且回調將錯誤對象作為第一個參數,並將主函數的結果作為下一個參數。 就您而言, doc 僅在主函數執行完成后才執行回調。 因此,在console.log("A: " + doc) ,doc是XX.getXXByUsername函數的輸出,因此它不是未定義的。

因為getXXByUsername()回調比該函數調用之后的代碼執行晚。 換句話說,在函數從數據庫中檢索數據后執行回調。 同時main函數繼續執行,因此您比A早得到B

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM