我正在尝试做一个简单的任务。这是我的功能,我正在接受一个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
});
}
答案 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
。承诺会有点干净,但那是一个完全不同的主题。