2016-11-29 46 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当所有的数据是可用的。承诺会更清洁一些,但这是一个完全不同的主题。