变量值没有被存储,js是否在编写时编译代码?

时间:2016-11-29 00:45:12

标签: javascript

我正在尝试做一个简单的任务。这是我的功能,我正在接受一个url链接作为参数。我阅读了链接,废弃了标题和标题等数据。然后我只是尝试将数据存储在mongo中。 出于某种原因,查看此代码控制台首先打印y,然后打印x。 为什么javascript没有编写代码,因为它是写的? 关于我如何能够将这些数据存储在全局var中的任何帮助。 谢谢 我相信这是一个回电错误..

    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
    });
}

1 个答案:

答案 0 :(得分: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++;
}

这将启动xray运行,并在所有数据都可用时调用Items.insert。承诺会有点干净,但那是一个完全不同的主题。