1

在下面的代码中,您看到我发出了一个 HTTP 请求。我解析响应并拉出一个“令牌”(一个字符串)。我想返回该令牌,以便将其值分配给 foo。

foo = request.post(
        {
            url: 'http://10.211.55.4/api/2.0/auth/signin',
            body: reqLogin.toString(),
            headers: {'Content-Type': 'text/xml'}
        },
        function(err, response, body) {
            if(err) {
                console.log(err);
                process.exit(1);
            } 
            else {
                parseString(body, function (err, result) {
                    tokencontainer = (result.tsResponse.credentials[0]);
                    token = tokencontainer.$.token;
                    console.log('Logged in, token is ', token);
                    return token;
                });
            }           
        }
    );

当我运行这段代码时,foo 的对象类型是 Request。我可以以某种方式将整个请求转换为“字符串”,这样我就不会得到分配给 foo 的请求对象吗?我只是想要分配给变量的“令牌”值。

谢谢!

4

1 回答 1

4

如果您使用 Mikeal 的请求库,.post() 方法(或任何其他方法)不会返回承诺(即使返回,您也无法以这种方式分配(而是承诺)。

因此,您的选择是:

  1. 将使用“foo”的逻辑移动到一个单独的函数中,并以回调的形式调用它。
  2. 使用辅助库之一(如 Q)将 .post() 包装在一个承诺中。
  3. 找到一个支持 Promise 的 HTTP 库。

(注意:我写了上面的代码但没有运行它,所以它可能无法按原样工作。但它给了你一个想法)

选项 1 可能如下所示:

var logicUsingFoo = function(foo) {
  // do stuff with foo here
};

request.post({...}, function (err, response, body) {
  // ...
  logicUsingFoo(token);
});

// Here, you can't really use foo, because request.post() has not yet
// finished. In Javascript, there's no way to pause program execution.
// You need to either use callbacks, or promises.

选项 2

像(使用Q 库):

var promisePost = function(params) {
    var q = Q.defer();

    request.post(params, function(err, response, body) {
      if (err) {
          q.reject(err);
      } else {
          q.resolve(body);
      }
    };

    return q.promise;
}

然后使用它:

promisePost({url: ..., headers: ...}).then(function (body) {
  // Do stuff with body, obtain token etc.
}, function (err) {
  // Handle error
});

选项 3

例如,您可以使用Kris Kowal 的Q-IO,他为 Promise 创建了广泛使用的 Q 库。

于 2014-05-29T18:56:13.990 回答