从promise中返回一个字符串值

时间:2014-05-29 18:49:44

标签: javascript node.js node-request

在下面的代码中,您看到我发出了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吗?我只想将“标记”值分配给变量。

谢谢!

1 个答案:

答案 0 :(得分:3)

如果您正在使用Mikeal的请求库,.post()方法(或任何其他方法)不会返回一个承诺(即使它确实如此,您也无法分配这种方式(而非承诺)。

所以,你的选择是:

  1. 将使用“foo”的逻辑移动到单独的函数中,并将其调用为回调函数。
  2. 使用一个辅助库(如Q)在promise中包装.post()。
  3. 找到支持承诺的anotehr HTTP库。
  4. (注意:我编写了上面的代码,但没有运行它,所以它可能无法正常工作。但它会给你一个想法)

    选项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 library):

    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,这是为广告创建广泛使用的Q库的人。