regular = 'a string';
enriched = enrichString(regular);
sys.puts(enriched);
function enrichString(str){
//run str through some regex stuff or other string manipulations
return str;
}
现在它似乎做了我希望它会做的事情,但我不知道它是否安全。这有时会导致未定义吗?我是否需要做以下事情:
regular = 'a string';
enriched = enrichString(regular, function(data){sys.puts(data);});
function enrichString(str, cb){
//run str through some regex stuff or other string manipulations
cb(str);
}
感谢您的帮助!
答案 0 :(得分:3)
答案 1 :(得分:2)
如果您进行非同步非阻塞呼叫,则只需要回调。
var string = "foo",
new_string = enrich(foo);
doStuff(new_string);
enrich
阻止是安全的。例如
function enrich(str) {
// do regex stuff with str
// manipulate it
return str;
}
正在阻止所以这样做是安全的。
function enrich(str) {
// get some data from the database.
// store the string in a file.
return str;
}
使用非阻塞IO并且不安全。你想要做的是:
function enrich(str, cb) {
// get some data from the database.
// store the string in a file.
return cb(str);
}
var string = "foo",
new_string = enrich(foo, function (str) {
doStuff(new_string);
});
请注意
enriched = enrichString(regular, sys.puts(data));
不起作用,因为你传递了sys.puts(data)
的返回值作为你的函数参数(数据是未定义的!)
你需要传递一个函数。
答案 2 :(得分:0)
为了补充Pointy的响应,人们有时会强制使用process.nextTick(或在浏览器setTimeout(fn,0)中)进行异步行为 - 这会强制当前执行上下文产生。例如:https://github.com/caolan/async/blob/master/lib/async.js#L408-410