1

我可能对 Node.js 的异步性有一些问题。

休息.js

var Shred = require("shred");
var shred = new Shred();


module.exports = {
    Request: function (ressource,datacont) {
            var req = shred.get({
                    url: 'ip'+ressource,
                    headers: {
                Accept: 'application/json',

              },

              on: {
                // You can use response codes as events
                200: function(response) {
                  // Shred will automatically JSON-decode response bodies that have a
                  // JSON Content-Type
                  if (datacont === undefined){
                    return response.content.data;
                    //console.log(response.content.data);
                  }
                  else return response.content.data[datacont];
                },
                // Any other response means something's wrong
                response: function(response) {
                  return "Oh no!";
                }
              }
            });
    }
}

其他.js

var rest = require('./rest.js');

console.log(rest.Request('/system'));

问题在于,如果我从 other.js 调用请求,我总是会得到“未定义”。如果我在 rest.js 中取消注释 console.log,则 http 请求的正确响应将写入控制台。我认为问题在于该值是在请求的实际响应出现之前返回的。有谁知道如何解决这个问题?

最好的,dom

4

1 回答 1

4

首先,剥离您拥有的代码很有用。

Request: function (ressource, datacont) {
  var req = shred.get({
    // ...
    on: {
      // ...
    }
  });
}

你的Request函数从不返回任何东西,所以当你调用它和console.log结果时,它总是 print undefined。您的各种状态代码的请求处理程序调用return,但这些返回在各个处理程序函数内部,而不是在内部Request

不过,您对 Node 的异步性质是正确的。你不可能return得到请求的结果,因为当你的函数返回时,请求仍在进行中。基本上,当您运行时Request,您正在启动请求,但它可以在将来的任何时间完成。在 JavaScript 中处理这种情况的方式是使用回调函数。

Request: function (ressource, datacont, callback) {
  var req = shred.get({
    // ...
    on: {
      200: function(response){
        callback(null, response);
      },
      response: function(response){
        callback(response, null);
      }
    }
  });
}

// Called like this:
var rest = require('./rest.js');
rest.Request('/system', undefined, function(err, data){
  console.log(err, data);
})

您将第三个参数传递给Request该参数,该参数是请求完成时要调用的函数。可能失败的回调的标准节点格式是function(err, data){在这种情况下成功传递null,因为没有错误,并且您将 传递response为数据。如果有任何状态码,那么您可以将其视为错误或任何您想要的。

于 2013-02-15T15:24:38.653 回答