2

嗨stackoverflow社区,我正在尝试理解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);});
4

4 回答 4

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

问候。

于 2012-12-14T08:52:15.943 回答
2

核心 nodeJS 库中不使用 Promise。Promise 与回调一起被考虑,但由于没有达成共识,回调被选为更容易理解和更少开销。(当我第一次学习回调时,回调绝非易事)

在 nodeJS 中,一般的做法是回调函数以 anerr作为第一个参数,然后返回值。上面的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),否则成功。

于 2013-01-12T23:46:40.523 回答
0
r = n1 + n2;

这会为参数分配一个新值r

您要调用该函数:

r(n1 + n2);
于 2012-12-11T22:33:46.127 回答
0

让我分享一下我在 Oodles Technologies 工作时学到的东西。让我们举个例子。

假设有四个函数functionCalldoSomeworkOnedoSomeworkTwodoSomeworkTwo,它们正在执行一些 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
}

另一方面,回调很好。回调的主要问题是:嵌套在回调内部,嵌套在回调内部。在嵌套回调中,测试/维护代码非常困难。

承诺来了。Promise 为我们提供了一种更简洁、更健壮的异步代码处理方式。而不是使用回调。并且使用 Promise 处理错误也非常容易。

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 没有根本的不同。在您想要执行一系列操作的嵌套回调中建议使用 Promise。我希望这能帮到您。谢谢。

于 2016-10-19T07:11:06.387 回答