在nodejs中使用回调,promise

时间:2012-12-11 22:32:15

标签: node.js callback

您好stackoverflow社区, 我试图了解nodejs中的异步编码 ,特别是我试图在打电话后将结果传回主函数

我瞥了一眼,发现这可以通过使用

来完成
  1. 回调
  2. promises(我理解的承诺已从nodejs中删除,因此需要使用NPM包添加库)
  3. 无论如何回到主要问题,我已经厌倦了实现回调方法,但我做错了。请帮忙

    下面的代码是我为回调尝试的一些示例,但外部结果永远不会运行。基本上我希望将计算结果返回到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);});
    

4 个答案:

答案 0 :(得分: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

问候。

答案 1 :(得分:2)

核心nodeJS库中未使用Promise。承诺与回调一起考虑,但由于没有达成共识,因此选择回调更容易理解,减少开销。 (当我第一次学习它们时,回调并不容易)

在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),否则会成功。

答案 2 :(得分:0)

r = n1 + n2;

这会为r参数指定一个新值。

您想要调用该函数:

r(n1 + n2);

答案 3 :(得分:0)

让我分享我在Oodles Technologies工作所学到的知识。 让我们举个例子。

我们有四个功能 functionCall doSomeworkOne doSomeworkTwo doSomeworkTwo ,他们正在执行一些IO任务

函数doSomeworkThree functionCall取决于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来了。 Promise为我们提供了一种更清晰,更健壮的异步代码处理方式。而不是使用回调。并且使用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。 我希望这能帮到您。 感谢。