2016-11-29 44 views
0

我正在嘗試做一個簡單的任務。這裏是我的函數,我在URL鏈接作爲參數。我閱讀鏈接,將其廢棄爲標題和標題等數據。那麼我只是試圖將數據存儲在mongo中。 由於某種原因,查看這個代碼控制檯先打印y然後再打印x。 爲什麼javascript不編寫代碼? 任何幫助我如何能夠將這些數據存儲在全局變量中。 感謝 我相信這是一個回調的錯誤..變量值未被存儲,js是否在編寫代碼時編寫它?

insertNewItem(link){ 
    check(link, String); 
    var xray = new Xray(); 

    var tname; 
    xray(link, 'title')(function(err, title) { 
       tname = title; 
       console.log('x', tname); 
     }); 

    var header; 
    xray(link, 'h1')(function(err, h1) { 
      header = h1; 
     }); 

    console.log('y',tname); 
    Items.insert({ 
     url: link, 
     name: tname, 
     bio: header 
    }); 
} 
+0

由於在回調中記錄了'x',執行順序完全取決於'Xray'對象的實現。這是任何人都可以對這段代碼分離出來的唯一有意義的東西。您應該瞭解回調如何工作以及異步執行的含義。 –

+0

非常感謝你尼爾,使很多感覺..有沒有什麼方法可以繞過我的設計我可以在這裏完成我的最終目標。 bascially將值存儲在某個變量中並將其添加到數據庫中。也許創建一個外部函數來解析並返回值作爲參數.. @NielsKeurentjes – ankibunkers

回答

0

你的代碼段是有點短,但現在看來,該函數從xray返回異步執行它的回調。這意味着你的功能將運行到完成,然後你的回調(包含console.log('x'...)將被執行。

這很像setTimeout

setTimeout(function() { 
 
    console.log('a'); 
 
}, 1) 
 
console.log('b'); 
 
// Prints b, a

當你使用異步回調,你必須記住,你的代碼不會被執行頂部至底部。

它需要一點點包紮你的頭,但你最終趕上。

在你的情況,你可能會想要做的事,如:

var tname; 
var i = 0 
xray(link, 'title')(function(err, title) { 
    tname = title; 
    console.log('x', tname); 
    insert(); 
}); 

var header; 
xray(link, 'h1')(function(err, h1) { 
    header = h1; 
    insert(); 
}); 

console.log('y', tname); 

function insert() { 
    if (i = 1) Items.insert({ 
    url: link, 
    name: tname, 
    bio: header 
    }); 
    else i++; 
} 

,將開始運行的X射線,並呼籲Items.insert當所有的數據是可用的。承諾會更清潔一些,但這是一個完全不同的主題。