2017-06-16 73 views
-2

做我有node.js的一个简单的功能与开关在for循环:回调在node.js中

function bodybuilder(queryArea,callback) 
{ 
    var ret=''; 
    for (var attributename in queryArea.query) 
     { 
       switch(attributename) 
       { 
        case 'username': 
        { 
         ret+="Username branch added"; 
        } 
        break; 
        case 'what': 
        { 
           filename="./demo.html"; 
           fs.readFile(filename, function (err, data) 
             {if (err) throw(err); 
             var pom=data.toString(); 
             ret=ret+pom; 
             }); 
        } 
        break; 
        case 'color': 
        { 
         ret+="Color branch added"; 
        } 
        break; 
        default: ret+="Unknown query"; 
       } 
     } 
    return callback(ret); 
} 

每个开关分支访问并增加了一些返回值。

其中一个分支读取异步文件并将其内容添加到返回值中。

如何在所有开关分支完成后对此函数进行回调并返回值?这意味着,即使在处理文件的异步操作完成之后呢?节点并不等待那个。

这是一个学习的例子,所以显示原理是最好的。

回答

0

for循环中有一个异步代码,您需要从异步开关的情况下调用回调函数,因为它将在整个for循环执行后执行。

使用下面的代码片段是相同的:

function bodybuilder(queryArea,callback) 
{ 
    var ret=''; 
    for (var attributename in queryArea.query) 
     { 
      switch(attributename) 
      { 
       case 'username': 
       { 
        ret+="Username branch added"; 
       } 
       break; 
       case 'what': 
       { 
          filename="./demo.html"; 
          fs.readFile(filename, function (err, data) 
            {if (err) throw(err); 
            var pom=data.toString(); 
            ret=ret+pom; 
            callback(ret); 
          }); 
       } 
       break; 
       case 'color': 
       { 
        ret+="Color branch added"; 
       } 
       break; 
       default: ret+="Unknown query"; 
      } 
     } 
} 
+0

伟大的答案。尽可能保持一般 - 如果你不知道哪个分支最慢,如何确保这个功能?如果你有例如readFile在两个分支? –

+0

为所有异步调用保留计数器并在所有异步调用的回调中检查计数器if(counter == 的数量),如果为true,则调用整个函数的回调函数。 –

+0

真的很好,可以理解的答案。接受并感谢你 –