2012-12-11 14 views
2

嗨計算器社區, 我試圖瞭解異步的,在的NodeJS 編碼,特別是我試圖撥打電話使用回調,預示着要的NodeJS

我瞪大眼睛左右後傳回結果的主要功能並發現這是可以做到或者通過使用

  1. 回調
  2. 承諾(承諾據我所知從的NodeJS已被刪除,因此,需要使用包NPM添加的庫)

好歹又回到了主要的問題,我已經厭倦了去實現這些回調方法,但我做錯了什麼。請幫助

下面的代碼是一些樣本,我試圖回調,但外界的結果永遠不會運行。基本上我想把計算結果返回給r。

function calc (n1, n2 , r){ 

    r = n1 + n2; 
    console.log("inside result %s",r); 
} 


calc(1,2,function(r){ 
    console.log("outside result %s",r);}); 
+0

也許你只是在試驗,但是你寫的函數不是異步的,所以你可以返回結果。如果函數本身調用其他異步方法,則只需使用回調方法。 – JohnnyHK

回答

0
r = n1 + n2; 

此分配一個新值r參數。

你要調用的函數:

r(n1 + n2); 
+0

謝謝SLaks的答覆,我測試它,它的工作,但我想知道,鑑於我保持相同的代碼結構,有沒有辦法打印出模塊的計算結果,所以我得到了一個內部結果和外部結果 –

+0

@JoyDThi:把它放在一個變量中? – SLaks

2

上顯示回調影響以前的答案只是一個變化:

function calc (n1, n2 , result){ 
    var r = n1 + n2; 
    console.log("The first result is %s, ",r); 
    console.log("but for the final one we have to wait 2 seconds ..."); 
    setTimeout(function() { //waits 2 seconds 
     r = r * r; 
     console.log('Done!'); 
     result(r); 
    }, 2000); 
} 

calc(1,2,function(num){ 
    console.log("The final result is %s",num); 
}); 
console.log('... waiting, waiting ...'); //this shows up AFTER the first result but BEFORE the final one 

問候。

2

Promise在覈心節點JS庫中不使用。承諾與回調一起考慮,但由於沒有達成共識,所以選擇回調作爲更容易理解和更少的開銷。 (當我第一次瞭解它們時,回調函數很簡單)

在nodeJS中,一般的做法是回調函數有一個err作爲第一個參數,後面跟着返回值。上述calc功能應該是這樣的

function calc(a, b, callback) { 
    if (tired) 
    callback("Too tired to think."); // error return 
    else 
    callback(null, a + b);    // success, note the null 
} 

要叫它

calc(1, 2, function(err, sum) { 
    if (err) 
    console.error(err); 
    else 
    console.log("Sum is " + sum); 
}); 

注意function(err, sum)被作爲callback參數calc通過。要檢查是否發生了錯誤,只需執行if (err),否則它會成功。

0

讓我分享我在Oodles Technologies工作的經驗。我們舉一個例子。

讓有四個功能functionCalldoSomeworkOnedoSomeworkTwodoSomeworkTwo,他們正在執行一些IO任務。

函數doSomeworkThree函數調用取決於doSomeworkOne,doSomeworkOne取決於doSomeworkTwo,doSomeworkTwo取決於doSomeworkThree。爲了使這些同步,回調函數在所有函數中作爲參數傳遞。

function functionCall(data, callback){ 
    ........... 
    ........... 
    doSomeworkOne(data, callback); 
} 


function doSomeworkOne(data, callback){ 
    ........... 
    ........... 
    doSomeworkTwo(otherData, callback);   
} 


function doSomeworkTwo(otherData, callback){ 
    ........... 
    ........... 
    doSomeworkThree(otherData, callback); 
} 

<span style="font-size:16px;"><span style="font-family:arial,helvetica,sans-serif;"> function doSomeworkThree(otherData, callback){ 
    ........... 
    ........... 
    callback(result); 
} 
</span></span> 

function callback(data){ 
    return data 
} 

回調,而另一方面是好的。回調的主要問題是:嵌套在回調中,嵌套在回調中。在嵌套回調中,測試/維護代碼非常困難。

這裏的承諾來。 Promises爲我們提供了一種更簡潔更強大的處理異步代碼的方法。而不是使用回調。承諾處理錯誤也很容易。

function functionCall(data){ 
    doSomeworkOne(data).then(function(data){ 
     return doSomeworkTwo(data); 
    }).then(function(data){ 
     return  doSomeworkThree(data); 
    }).catch(function(e) { 
     // error handle  
    }); 
} 


function doSomeworkOne(data){ 
    retrun new Promise(function(resolve, reject){ 
     ........... 
     ........... 
     if(error){ 
      reject(error);   
     }else{ 
      resolve(success); 
     } 
    })   
} 


function doSomeworkTwo(data){ 
    retrun new Promise(function(resolve, reject){ 
     ........... 
     ........... 
     if(error){ 
      reject(error);   
     }else{ 
      resolve(success); 
     } 
    })   
} 


function doSomeworkThree(data){ 
    retrun new Promise(function(resolve, reject){ 
     ........... 
     ........... 
     if(error){ 
      reject(error);   
     }else{ 
      resolve(success); 
     } 
    })   
} 

注:承諾和回調都沒有本質上的區別。在你想要執行一系列操作的嵌套回調中,Promise是明智的。 我希望這會幫助你。 謝謝。