访问全局变量javascript
Accessing global variable javascript
我正在尝试使用nodejs、javascript下载一个网页。然而,它似乎有一个无限的循环。为什么?
var downloadFinished = false;
var downloadPage = function(url,file) {
rest.get(url).on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
} else {
fs.writeFileSync(file, result, 'utf8');
downloadFinished = true;
}
});
};
if(require.main == module) {
downloadPage('http://google.com', 'new.html');
while(!downloadFinished) {
// wait till download finished.
}
// do other stuff make sure download is finished to 'new.html'
}
Javascript是单线程的,如果你有一个循环,比如:
while(!downloadFinished) {
}
该循环将永远运行,并且不会运行其他函数(由于Javascript的单线程特性,在while循环完成之前,.on('complete'
回调无法执行,因此它永远不会完成,因为您没有在该循环中设置downloadFinished = true
或使用break
语句)。
为了解决这个问题,你可以在回调中做所有其他事情,直到下载完成才调用:
var downloadPage = function(url, file, callback) {
rest.get(url).on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
} else {
/* Don't use writeFileSync, unless you want to block your server,
from handling any requests at all until the disk IO completes
fs.writeFileSync(file, result, 'utf8');
callback();
*/
fs.writeFile(file, result, 'utf8', callback);
}
});
};
if(require.main == module) {
downloadPage('http://google.com', 'new.html', function after_download(){
// do other stuff make sure download is finished to 'new.html'
});
}
当您调用那个while(!downloadFinished)
时,它被设置为false,所以您基本上是在执行while(true)
。
选项1
您可以使用回调而不是while循环。
var successCallback = function() {
//do stuff here.
};
var downloadPage = function(url, file, callback) {
rest.get(url).on('complete', function(result) {
if (result instanceof Error) {
console.log('Error:', result.message);
} else {
fs.writeFile(file, result, 'utf8', callback);
}
});
};
if(require.main == module) {
downloadPage('http://google.com', 'new.html', successCallback);
}
选项2
看看Promises,他们会在这里真正帮助你。你可以使用Bluebird一个很好的Promise库,你可以添加到你的包依赖项中。
相关文章:
- 没有通过ajax调用设置Javascript全局变量
- Javascript全局变量简单解决方案
- 用作标志的Javascript全局变量
- Javascript全局变量问题
- 函数内部的JavaScript全局变量定义
- Selenium Web驱动程序访问Jquery中的Javascript全局变量
- Javascript全局变量在mouseup上总是未定义的
- Javascript全局变量存储在哪个对象中
- nodejs中的Javascript全局变量和属性-全局属性有时会被删除
- Javascript:全局变量转到“窗口”或“全局”,但全局函数不会.全球 FN 去哪儿了
- JavaScript 全局变量声明
- 与javascript全局变量范围和更新混淆
- 通过 Excel VBA 引用 Acrobat Javascript 全局变量所需的语法是什么?
- Javascript - 全局变量和全局范围内的变量是否不同(在 jsfiddle 中)
- Javascript 全局变量命名冲突
- Javascript:全局变量=坏
- Javascript 全局变量在回调函数之外不会保持不变
- javascript 全局变量不能存储值,如果它意味着从 HTML 元素中提取它们
- 创建/访问在 AJAX 调用中创建的 Javascript 全局变量
- 拼接上的Javascript全局变量作用域/覆盖