2013-07-14 140 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

爲什麼這麼消極? :)我剛纔描述了另一種可以實現併發的方式。如果有任何錯誤或誤導,我很樂意予以糾正。 –