[英]using callback, promises in nodejs
您好stackoverflow社區,我試圖理解異步,在nodejs中編碼,特別是我試圖在調用后將結果傳遞回main函數
我四處張望,發現可以通過使用
無論如何,回到主要問題,我已經厭倦了實現回調方法,但是我做錯了什么。 請幫忙
下面的代碼是我為回調嘗試的一些示例,但是外部結果永遠不會運行。 基本上我希望將計算結果返回給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);});
只是前一個答案的變體,顯示了回調效果:
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
問候。
核心nodeJS庫中未使用承諾。 承諾與回調一起被考慮,但是由於沒有共識,因此選擇回調是因為它更易於理解且開銷更少。 (當我第一次學習回調時,它很簡單)
在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)
,否則就成功了。
r = n1 + n2;
這將為r
參數分配一個新值。
您要調用該函數:
r(n1 + n2);
讓我分享一下我在Oodles Technologies所學的知識。 讓我們舉個例子。
讓我們使用四個函數functionCall , doSomeworkOne , doSomeworkTwo和doSomeworkTwo ,它們正在執行一些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
}
另一方面, Callback很好。 回調的主要問題是:嵌套在回調內部,嵌套在回調內部。 在嵌套回調中,測試/維護代碼非常困難。
承諾來了。 承諾為我們提供了一種更清潔,更健壯的異步代碼處理方式。 而不是使用回調。 而且處理帶有承諾的錯誤非常容易。
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和Callbacks沒有根本的不同。 建議在要執行一系列操作的嵌套回調中使用Promises。 我希望這能幫到您。 謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.