如何等待回调函数在node.js中获取响应

时间:2011-12-02 07:19:54

标签: node.js

当我的回调函数解析wsdl文件并给我回复时,我想显示html页面,其中我想显示列表视图,其中包含来自我的node.js请求处理程序的解析数据。这是我的代码,

soap.createClient(AW_URL, function(err, client) {
  if (err) {
    console.log(err.stack);
    return;
  } 
  else {
    client.setSecurity(new soap.WSSecurity(auth.login, auth.key));
    client.ListProviders(function(err, res) {
         if (err) {
              console.log(err.stack);
              return;
         }
         else {
              var pro = res.Providers[1];
              console.log(pro);

         }
    });
  }
});

//var body = html page

    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();

所以我不知道如何等待soap客户端回调函数来获取数据,因为 在数据来到我之前html进入前面。需要帮助。对我来说,任何建议都是很有帮助的。谢谢。

2 个答案:

答案 0 :(得分:1)

node.js中的程序流程如下:

response.writeHead(200, { "Content-Type": "text/html" });

doSomethingAsync(function (err, res) {
    response.write(res);
    response.end();
});

因此,您无需立即致电end()。您可以从任何回调中调用它,然后行为将按预期进行。

答案 1 :(得分:0)

您实际上没有指定要生成html的位置。所有client方法都接受回调(您错误地将回调放入client.ListProviders的args对象位置。

假设您希望client.ListProviders在您的响应被编写之前执行...

// where is `response` getting set?? it's not in your example
var response;

function callback() {
   // do stuff here
   response.writeHead(200, {"Content-Type": "text/html"});
   response.write(body);
   response.end();
}

soap.createClient(AW_URL, function(err, client) {
   if (err) {
      //errors
   }
   else {
      client.ListProviders({x: 2, y: 4}, callback);
   }
});

但是,我不确定问题是什么。想必你的肥皂电话会输出一些HTML?所以你可能想要更像这样的东西:

// where is `response` getting set?? it's not in your example
var response;
var headerHtml = '<h1>Hello World!</h1>';
var footerHtml = '<div>I like swords!</div>';

// create whatever goes above the soap call
response.writeHead(200, {"Content-Type": "text/html"});
response.write(headerHtml);


function callback(err, result) {

   // do some stuff that create's html and call response.write();

   finishPage();
}

function finishPage() {
   response.end(footerHtml);
}

soap.createClient(AW_URL, function(err, client) {
   if (err) {
      //errors
   }
   else {
      client.ListProviders({x: 2, y: 4}, callback);
   }
});