如何使一些同步代码先于其他异步代码运行
How to make some synchronous code run before some other asynchronous code?
我有一个这样的函数:
var download = function(url, name) {
http.get(url, function(response) {
// part1 : create a new folder if it doesn't exist
dir = './name';
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
// part 2: download and save file into that folder
response.on('data', function (data) {
fs.appendFileSync(dir, data);
});
})
}
我希望第1部分在第2部分运行之前完成(这样我就可以有第2部分的目录)。我该怎么做?
(在上面的代码中,据我所知到目前为止(我是node.js的新手),这两个部分将同时运行,所以我不确定第1部分将总是在第2部分运行之前完成)。
两个部分将同时运行
不,他们不会。existsSync
和mkdirSync
为阻塞呼叫。因此,只有在它们被执行之后,事件处理程序才会被附加。
但是,我们应该在适当的时候利用异步性。在这种情况下,您可以使用exists
和mkdir
异步副本。
function download(url, name) {
function attachAppender(filename, response) {
response.on('data', function (data) {
fs.appendFile(filename, function (err) {
res.statusCode = err ? 500 : 200;
response.end();
});
});
}
http.get(url, function (response) {
var dir = './name';
fs.exists(dir, function (exists) {
if (!exists) {
fs.mkdir(dir, function (err) {
if (err) {
res.statusCode = 500;
res.end();
} else {
// pass the actual full file name
attachAppender(filename, response);
}
});
} else {
attachAppender(filename, response);
}
});
});
}
注意: fs.exists
已弃用,可能很快会被删除。最好用fs.stat
代替。
您正在使用同步函数,因此调用被阻塞。然而,正如四眼所提到的,出于性能原因,最好使用异步版本。
如果你想避免回调地狱(即你的代码变得越来越难以阅读,因为你链异步调用),你可以使用一个库,如async.js,其目的是试图使其更容易编写(当然,更容易阅读)。
这是一个从async.js的单元测试中取出的例子:每个async函数都是在另一个之后调用的。
var series = function(test){
var call_order = [];
async.series([
function(callback){
setTimeout(function(){
call_order.push(1);
callback(null, 1);
}, 25);
},
function(callback){
setTimeout(function(){
call_order.push(2);
callback(null, 2);
}, 50);
},
function(callback){
setTimeout(function(){
call_order.push(3);
callback(null, 3,3);
}, 15);
}
],
function(err, results){
test.ok(err === null, err + " passed instead of 'null'");
test.same(results, [1,2,[3,3]]);
test.same(call_order, [1,2,3]);
test.done();
});
}
有很多其他的举措,为了使一系列的异步调用更容易读写(async/await,纤维。js为例)
相关文章:
- 如何消除代码中的未定义和其他问题
- jquery代码在Mozilla中有效,但在其他浏览器上无效
- Javascript阻止其他Javascript代码
- 调试一个简单的jQuery函数;想知道是否与其他代码冲突
- 如何在本地存储(或其他数据库)上安全地保存敏感访问代码
- onbeforeunload事件在我的代码中没有触发,但其他示例可以工作
- 使用Javascript创建的Cookie在C#代码中不可访问..任何原因或其他选择
- jQuery代码,用于在检查行时获取其他列的数据
- Javascript代码会错误其他代码
- php/mysql搜索结果-当类型>1,同时保持其他类型不>1-代码点火器
- 使用appendchild或其他方法向ul添加html代码而不是纯文本
- @internal react 代码中的 JavaScript 文档标签,是 jsdoc、闭包还是其他什么
- 用于向外折叠车窗和向内折叠所有其他车窗的代码
- AngularJS计时器代码获胜'Don’不要经历所有其他条件
- Fancybox图像点击可以独立工作,但不能与我的其他代码一起工作
- 当其他函数调用Javascript时运行我的代码
- 这个JavaScript / jQuery代码是否在ie8或其他浏览器中泄漏
- CSS 在基于 URL 上工作,但不在网站的其他页面中使用.代码点火器
- 除了JS,其他语言是否按加载顺序执行代码
- 使用 JS 代码设置鼠标位置,并将位置放在其他 JS 代码中