这样的东西在异步代码中有效吗?

时间:2011-05-21 13:37:44

标签: javascript jquery asynchronous node.js callback

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);
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

不,你应该没事。直接运行的计算代码本质上不是异步的。当涉及外部资源的某些操作 - 文件I / O,网络操作,某些操作系统交互等等时,需要回调。

答案 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