您好stackoverflow社区, 我试图了解nodejs中的异步编码 ,特别是我试图在打电话后将结果传回主函数
我瞥了一眼,发现这可以通过使用
来完成无论如何回到主要问题,我已经厌倦了实现回调方法,但我做错了。请帮忙
下面的代码是我为回调尝试的一些示例,但外部结果永远不会运行。基本上我希望将计算结果返回到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 :(得分: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。 我希望这能帮到您。 感谢。