node.js中的node.js / Synchronize回调

时间:2014-05-02 20:12:03

标签: javascript 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会继续执行。

我怎能避免它?

2 个答案:

答案 0 :(得分: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!");
       }
   }
}

答案 1 :(得分:0)

首先,您的testFunction返回undefined,在这种情况下,结果将在任何时候都未定义(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

您需要更改函数的返回值以使用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。< / p>