2014-05-02 134 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。