Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类似的东西在异步代码中工作吗?_Javascript_Jquery_Asynchronous_Node.js_Callback - Fatal编程技术网

Javascript 类似的东西在异步代码中工作吗?

Javascript 类似的东西在异步代码中工作吗?,javascript,jquery,asynchronous,node.js,callback,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);
sys.puts(enriched);

function enrichString(str){
    //run str through some regex stuff or other string manipulations
    return str;
}

谢谢你的帮助

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

只有在进行非同步非阻塞调用时,才需要回调

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);
}
如果
enrich
被阻塞,则是安全的。比如说

var string = "foo",
    new_string = enrich(foo);

doStuff(new_string);
正在阻止,所以这样做是安全的。何处为

function enrich(str) {
    // do regex stuff with str

    // manipulate it

    return str;
}
使用非阻塞IO且不安全。您要做的是:

function enrich(str) {
    // get some data from the database.

    // store the string in a file.

    return str;
}
注意

experiment=enrichString(常规,系统输入(数据))

不起作用,因为您将返回值
sys.put(data)
作为函数参数传递(数据也未定义!)


您需要传入一个函数。

为了添加Pointy的响应,人们有时会使用process.nextTick(或在浏览器setTimeout(fn,0))强制执行异步行为-这会强制当前执行上下文。例如:

@Pointy你还是打败了我,因为你做了旧的答案增量更改。啊,是的,在sys.puts()中传递的示例弄糟了-感谢所有伟大的infoor
setTimeout
setInterval
等等。
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);
    });