2013-07-14 201 views
-2

异步调用可以说我有例如同步功能:以同步功能

var sum = function(x,y){ 
    return x+y 
} 

我想调用这个函数是异步的。这怎么可能?下面的函数是否被认为是异步函数?如果这是一个异步函数,那么我应该在第一个函数的日志之前记录第二个函数的日志?我知道这是一个非常简单的例子,它可能不是异步函数的理想情况。但我只是想明确这个基本点。

function(a, b, c, d, e, f, function(){ 
    console.log(result); 
}) 
{ 
    result = sum(a, b); 
    result = sum(result, c); 
    result = sum(result, d); 
    result = sum(result, e); 
    result = sum(result, f); 
    return 
)}; 


function(a, b, function(){ 
    console.log(result); 
}) 
{ 
    result = sum(a, b); 
    return 
)}; 

请帮帮我。如果这不正确,那么请帮我写下它应该如何写?

+0

你似乎不理解回调和异步编程。你的代码中没有任何异步的东西。 –

+0

我看到这是标记为node.js,所以我会指出你到这个线程:http://stackoverflow.com/questions/5786016/how-do-i-make-this-js-function-asynchronous哪些地址一些如果不是大部分,你的问题。 –

+0

该代码不解析(您正在使用函数表达式,其中在您定义的两个外层函数中都需要参数名称,并且存在一些paren /大括号错误匹配)。 –

回答

3

从上昆汀的回答您的评论

如何创建它有它这里面的一些操作的功能是正常的同步功能,但整体流程不会等待这个函数来完成,而移动到下一个功能。

JavaScript是语言,没有这个功能。所以你看看它运行的环境,看看环境是否有这个功能。

NodeJS确实。实际上,它有几个:setTimeout(这有点像浏览器给你的),setImmediateprocess.nextTick。对于你的用例,setImmediate可能是最好的选择,但是see this question and its answers for more on thatsetImmediate看起来是这样的:

setImmediate(functionToCall); 

(这是一个全球性的,你不必require任何东西。)

这不正是您的标题询问:异步调用同步功能。


从下面的评论:

我只需要创建一个异步函数内部,我称之为正常的同步功能。当我的意思是异步函数我的意思是,当我调用此函数不完成

后阻碍流动而转移到下一个功能,该功能可以做一些事情(如日志)这是不太你的问题同样的问题。 :-)

首先,没有异步功能(在JavaScript中)。当您在JavaScript中调用函数时,该函数将被同步执行。因此,这意味着你有两个选择:

  1. 调用代码可以使用setImmediate告诉节点异步调用的函数,或

  2. 功能可以做到这一点本身,可能使用一个嵌套函数。

这里的#1:

,输出:

A 
B 
C

这里的#2:

function foo() { 
    console.log("A"); 
    bar("C"); 
    console.log("B"); 
} 
function bar(arg) { 

    setImmediate(run); 

    function run() { 
     console.log(arg); 
    } 
} 
foo(); 

...这也输出

A 
B 
C

请注意,“C”是如何作为参数传递给bar的。 bar不做任何事,只是安排回调嵌套功能runrun使用参数。

+0

不,我不需要安排它。我只需要创建一个异步函数,我在其中调用一个普通的同步函数。当我指的是异步函数时,我的意思是当我调用这个函数时,它不会阻塞流程,并且流程转到下一个函数,并且此函数可以在完成后执行某些操作(如日志记录) –

+0

同样的方式表示哪种方式?我不明白你的意思。 –

+0

请使用示例编辑您的答案。这在理解上会好得多。 –

0

这怎么可能?

不是。它所做的一切都是同步操作。

在处理内在异步的事情时,您使用异步代码。这在JS中是有限的,几乎完全是事件处理。

下面的函数是否被认为是异步函数?

不。它有一个回调,但它所做的一切都是同步的。

+0

比我将如何实现这样的东西? –

+0

你不会,因为这样做没有意义。 – Quentin

+0

什么没有意义?基本上我想知道的是如何创建一个异步函数,我在其中调用一个普通的同步函数返回一些东西。 –

-2

在Javascript中(暂时搁置节点)应通过setTimeout()调用异步函数。在等待的setTimeout不会阻止脚本执行:

function someThingThatTakesAWhile() { 
    for (var i = 0; i < someVeryLargeNumber; i++) { 
     //... 
    }; 
} 
setTimeout(function() { 
    someThingThatTakesAWhile(); 
}, 0); 

(没有测试过,请原谅错别字,& C)

但是,如果你想要做这点,我不我认为这是你真正想要的。

+1

我想在节点 –

+0

P.S.您“返回”价值的能力将不复存在。您需要调用另一个函数(回调函数)来处理“异步”函数的结果。 –

+0

然后请在您的问题上看到我上面的评论,指出你的近乎重复的计算器问题。 –

0

我并不完全相信我明白你需要什么,但我相信你要找的是创建并发函数调用,这意味着你可能需要运行一个潜在的计算密集型代码,并且在计算运行时,您不希望它阻止执行其他代码。 Node.js通常用于单线程进程,这意味着在给定的时间只能运行一段代码,但仍有一些方法可以实现。

正如@ T.J中所述的一种方法。 Crowder的答案是,将你的函数调用与process.nextTick排队,这样它就会在事件循环的下一个循环中运行。这可以帮助将密集型计算分解为迭代,并且每个迭代将排队在最后一个循环之后的下一个事件循环周期中运行。这可以在某些情况下有所帮助,但并不总是可以将计算分解为彼此运行异步的迭代。如果你想要更详细地解释Javascript如何异步运行,我建议阅读this book

至少有两种其他方式(我知道)通过节点实现某种并发。js - 工人/线程和子进程。简而言之,子进程只是由主应用程序运行的另一个Node.js进程。如果您想要这样做,您可以使用Node.js的本机* child_process *模块来运行和管理您的子进程。查看official docs了解更多信息。

做到这一点的第三种方式是以与浏览器中Web Worker的使用方式非常相似的方式使用Workers。 Worker是与主应用程序不同的OS线程运行的代码片段。对我来说,这似乎是实现并发性的最简单方法,但有些人会认为这不是最可靠的方法,并且创建子进程更好。

对于工作人员如何在MDN上运行有很好的解释。要使用的工人,Node.js您需要一个外部模块,如webworker-threads

下面是从你的样品,从他们的文档片段创建的代码示例:

var Worker = require('webworker-threads').Worker; 

var worker = new Worker(function(){ 
    onmessage = function(event) { 
     result = sum(event.data.a, event.data.b); 
     result = sum(result, event.data.c); 
     result = sum(result, event.data.d); 
     result = sum(result, event.data.e); 
     result = sum(result, event.data.f); 
     postMessage(result); 
     self.close(); 
    }; 
}); 
worker.onmessage = function(event) { 
    console.log("The result is: " + event.data); 
}; 
worker.postMessage({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}); 

// Do some other stuff that will happen while your Worker runs... 

与所有的说,大多数人会尽量避免在Node.js的运行并行代码。 Javascript的异步特性使编写简单而简洁的后端代码变得很容易,通常你会希望通过不尝试将并发性引入到你的应用程序中,除非它是绝对必要的。

+0

为什么这么消极? :)我刚才描述了另一种可以实现并发的方式。如果有任何错误或误导,我很乐意予以纠正。 –