2014-05-02 89 views
0

我是node.js的新手,据我所知,任何回调都会创建一个新的事件,并行执行。node.js /在node.js中同步回调

例如,我有回调的下一个代码:

function testFunction(var1){ 
    s3.heah(var1, function(data, err){ 
     return err; 
    }) 
} 

,然后我打电话给这个函数:

function callToOtherFunc(var1){ 
    var result = testFunction(var1); 
    if (result != null){ 
     console.log("This is an error!"); 
    } 
} 

依我之见,result总是null,这是因为s3.head起飞有一段时间要退回,并且callToOtherFunc继续执行。

我该如何避免它?

+0

s3.heah的源代码将帮助你。 –

回答

0

如果你不能改变的代码太多了,你需要在s3.heah方法是这样的回调执行的回调:

function testFunction(var1, callback){ 
    s3.heah(var1, function(data, err){ 
     callback(err); 
    }); 
} 

function callToOtherFunc(var1){ 
    testFunction(var1, function(err) { 
     if (result != null){ 
      console.log("This is an error!"); 
     } 
    } 
} 
0

所有testFunction回报不确定的首先,在这种情况下,结果将在任何时候都未定义(result == null)。

改述上一个答案,您需要将result值传递给回调函数。

function testFunction(var1, callback){ 
    s3.heah(var1, function(data, err){ 
     callback(err, data); 
    }); 
} 

function callToOtherFunc(var1){ 
    testFunction(var1, function(err, result) { 
     if (result != null){ 
      console.log("This is an error!"); 
     } 
    } 
} 

为了避免这种异步地狱使用async

您需要更改的函数的返回值与异步的工作:

function testFunction(var1, callback){ 
    var1 += 1; 
    callback(null, var1); 
} 

function callToOtherFunc(err, result){ 
    if (result != null){ 
     console.log("This is an error!"); 
    } 
} 

var workflow = async.compose(testFunction, s3.heah), 
    var1 = 10; 
workflow(var1, callToOtherFunc); 

它将工作很好,如果你可以改变S3的来源。 heah与回调function(err, data)而不是function(data, err)一起工作,如果不可行 - 不要在工作流中包含s3.heah。