簡體   English   中英

使用回調,諾言在nodejs

[英]using callback, promises in nodejs

您好stackoverflow社區,我試圖理解異步,在nodejs中編碼,特別是我試圖在調用后將結果傳遞回main函數

我四處張望,發現可以通過使用

  1. 回調
  2. promises(據我了解,promises已從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);});

只是前一個答案的變體,顯示了回調效果:

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所學的知識。 讓我們舉個例子。

讓我們使用四個函數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
}

另一方面, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM