我一直在阅读nodebeginner 而且我遇到了以下两段代码.
第一个:
var result = database.query("SELECT * FROM hugetable");
console.log("Hello World");
Run Code Online (Sandbox Code Playgroud)
第二个:
database.query("SELECT * FROM hugetable", function(rows) {
var result = rows;
});
console.log("Hello World");
Run Code Online (Sandbox Code Playgroud)
我得到了他们应该做的事情,他们查询数据库以检索查询的答案.然后console.log('Hello world')
.
第一个应该是同步代码.第二个是异步代码.
两件作品之间的区别对我来说非常模糊.输出会是什么?
谷歌搜索异步编程也没有帮助我.
我过去做过一些jQuery,但我完全坚持这个.我知道使用同步ajax调用的优点和缺点,但在这里它将是必需的.
加载远程页面(使用firebug控制),但不显示任何返回.
我应该做些什么让我的功能正常返回?
function getRemote() {
var remote;
$.ajax({
type: "GET",
url: remote_url,
async: false,
success : function(data) {
remote = data;
}
});
return remote;
}
Run Code Online (Sandbox Code Playgroud) 假设您维护一个公开函数的库getData
.您的用户将其调用以获取实际数据:
var output = getData();
在引擎盖下,数据保存在文件中,因此您getData
使用内置的Node.js 实现fs.readFileSync
.很明显这两个getData
和fs.readFileSync
是同步的功能.有一天,您被告知要将基础数据源切换到MongoDB等只能异步访问的仓库.您还被告知要避免惹恼您的用户,getData
不能更改API以仅返回承诺或要求回调参数.你如何满足这两个要求?
使用回调/保证的异步函数是JavasSript和Node.js的DNA.任何非平凡的JS应用程序都可能充满了这种编码风格.但这种做法很容易导致所谓的厄运金字塔回调.更糟糕的是,如果调用链中任何调用者中的任何代码都依赖于异步函数的结果,那么这些代码也必须包含在回调函数中,对调用者施加编码样式约束.我不时发现需要将异步功能(通常在第三方库中提供)封装到同步功能中,以避免大规模的全局重新分解.搜索关于此主题的解决方案通常最终得到Node Fibers或从中派生的npm包.但纤维无法解决我所面临的问题.甚至纤维作者提供的例子说明了这一缺陷:
...
Fiber(function() {
console.log('wait... ' + new Date);
sleep(1000);
console.log('ok... ' + new Date);
}).run();
console.log('back in main');
Run Code Online (Sandbox Code Playgroud)
实际产量:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
Run Code Online (Sandbox Code Playgroud)
如果函数Fiber确实将异步函数sleep转为同步,则输出应为:
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
back in …
Run Code Online (Sandbox Code Playgroud) 我想删除一些mongodb集合,但这是一个异步任务.代码将是:
var mongoose = require('mongoose');
mongoose.connect('mongo://localhost/xxx');
var conn = mongoose.connection;
['aaa','bbb','ccc'].forEach(function(name){
conn.collection(name).drop(function(err) {
console.log('dropped');
});
});
console.log('all dropped');
Run Code Online (Sandbox Code Playgroud)
控制台显示:
all dropped
dropped
dropped
dropped
Run Code Online (Sandbox Code Playgroud)
all dropped
在删除所有集合后,最简单的方法是打印什么?任何第三方都可用于简化代码.
是否可以.js
同步调用文件然后立即使用它?
<script type="text/javascript">
var head = document.getElementsByTagName('head').item(0);
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', 'http://mysite/my.js');
head.appendChild(script);
myFunction(); // Fails because it hasn't loaded from my.js yet.
window.onload = function() {
// Works most of the time but not all of the time.
// Especially if my.js injects another script that contains myFunction().
myFunction();
};
</script>
Run Code Online (Sandbox Code Playgroud)
这是简化的.在我的实现中,createElement的东西在一个函数中.我想在函数中添加一些东西,可以在返回控件之前检查某个变量是否被实例化.但是,当我从另一个我无法控制的网站中包含js时,仍然存在一个问题.
思考?
编辑:
我现在已经接受了最好的答案,因为它为正在发生的事情提供了一个很好的解释.但如果有人对如何改进这一点有任何建议我会向他们开放.这是我想做的一个例子.
// Include() is a custom function to import js.
Include('my1.js');
Include('my2.js');
myFunc1('blarg');
myFunc2('bleet');
Run Code Online (Sandbox Code Playgroud)
我只是想从不必知道的内部太多,只能够说,保持"我希望用这个模块,现在我会使用一些代码吧."
我只发现了涉及类,事件处理程序和回调的相当复杂的答案(在我看来,这似乎是一个有点大锤的方法).我认为回调可能有用但我似乎无法在最简单的上下文中应用这些.看这个例子:
<html>
<head>
<script type="text/javascript">
function myfunction() {
longfunctionfirst();
shortfunctionsecond();
}
function longfunctionfirst() {
setTimeout('alert("first function finished");',3000);
}
function shortfunctionsecond() {
setTimeout('alert("second function finished");',200);
}
</script>
</head>
<body>
<a href="#" onclick="javascript:myfunction();return false;">Call my function</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在此,第二个函数在第一个函数之前完成; 什么是最简单的方法(或者有一个?)强制第二个函数延迟执行直到第一个函数完成?
- -编辑 - -
所以这是一个垃圾的例子,但多亏了David Hedlund,我看到这个新的例子确实它是同步的(同时在测试过程中崩溃我的浏览器!):
<html>
<head>
<script type="text/javascript">
function myfunction() {
longfunctionfirst();
shortfunctionsecond();
}
function longfunctionfirst() {
var j = 10000;
for (var i=0; i<j; i++) {
document.body.innerHTML += i;
}
alert("first function finished");
}
function shortfunctionsecond() {
var j …
Run Code Online (Sandbox Code Playgroud) 我试图在单元格中加载已解析的数据,但问题是它是同步发生的,UitableView在数据加载完成之前不会显示.我试图通过使用performSelectorInBackground解决问题,但现在数据没有加载到单元格中,直到我开始滚动.这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self performSelectorInBackground:@selector(fethchData) withObject:nil];
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
self.listData = nil;
self.plot=nil;
}
-(void) fethchData
{
NSError *error = nil;
NSURL *url=[[NSURL alloc] initWithString:@"http://www.website.com/"];
NSString *strin=[[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
HTMLParser *parser = [[HTMLParser alloc] initWithString:strin error:&error];
if (error) {
NSLog(@"Error: %@", error);
return;
}
listData =[[NSMutableArray alloc] init];
plot=[[NSMutableArray alloc] …
Run Code Online (Sandbox Code Playgroud) 我有一个Node.js/Express应用程序,用于查询路径中的MySQL数据库并将结果显示给用户.我的问题是如何在将用户重定向到他们请求的页面之前完成两个查询之前运行查询并阻止?
在我的示例中,我有2个查询需要在呈现页面之前完成.如果我在查询1的"结果"回调中嵌套查询2,我可以使查询同步运行.但是当查询数量增加时,这将变得非常复杂.
如何同步运行多个(在本例中为2个)数据库查询而不将后续查询嵌套在先前查询的"结果"回调中?
我已经查看了Node模块中的'Flow control/Async goodies',并尝试了flow-js,但我无法使用异步查询.
下面列出了我试图从'/ home'路由执行的2个查询.节点专家能否解释"正确"的方法.
app.get('/home', function (req,res) {
var user_array = [];
var title_array = [];
// first query
var sql = 'select user_name from users';
db.execute(sql)
.addListener('row', function(r) {
user_array.push( { user_name: r.user_name } );
})
.addListener('result', function(r) {
req.session.user_array = user_array;
});
// second query
var sql = 'select title from code_samples';
db.execute(sql)
.addListener('row', function(r) {
title_array.push( { title: r.title } );
})
.addListener('result', function(r) {
req.session.title_array = title_array;
});
// because the queries …
Run Code Online (Sandbox Code Playgroud) synchronous ×10
asynchronous ×6
javascript ×5
node.js ×4
execution ×2
ajax ×1
blocking ×1
callback ×1
cocoa ×1
database ×1
dom ×1
jquery ×1
mongoose ×1
node-fibers ×1
objective-c ×1
uitableview ×1