Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从承诺返回字符串值_Javascript_Node.js_Node Request - Fatal编程技术网

Javascript 从承诺返回字符串值

Javascript 从承诺返回字符串值,javascript,node.js,node-request,Javascript,Node.js,Node Request,在下面的代码中,您可以看到我发出了一个HTTP请求。我解析响应并拉出一个“token”(字符串)。我想返回该令牌,以便将其值分配给foo foo = request.post( { url: 'http://10.211.55.4/api/2.0/auth/signin', body: reqLogin.toString(), headers: {'Content-Type': 'text/xml'}

在下面的代码中,您可以看到我发出了一个HTTP请求。我解析响应并拉出一个“token”(字符串)。我想返回该令牌,以便将其值分配给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。我是否可以将整个请求转换为“string”,这样就不会将请求对象分配给foo?我只想将“token”值分配给变量


谢谢

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

因此,您的选择是:

  • 将使用“foo”的逻辑移动到单独的函数中,并以回调的形式调用它
  • 使用一个帮助程序库(如Q)将.post()封装在承诺中
  • 查找支持承诺的anotehr 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

    例如(使用):

    然后使用它:

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


    例如,您可以使用Kris Kowal,他创建了广泛使用的Q库来实现承诺。

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

    因此,您的选择是:

  • 将使用“foo”的逻辑移动到单独的函数中,并以回调的形式调用它
  • 使用一个帮助程序库(如Q)将.post()封装在承诺中
  • 查找支持承诺的anotehr 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

    例如(使用):

    然后使用它:

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


    例如,你可以使用Kris Kowal的作品,他创建了广泛使用的承诺Q库。

    X和Y问题,查一下。当你知道只有在未来,当请求得到响应时才能设置foo时,尝试设置foo有什么意义?人们会回答你,但这对你的情况没有帮助。你的公司的所有后续操作de必须是异步的。如何返回承诺?请学习使用局部变量。所有的
    foo
    tokencontainer
    token
    都是隐式全局的。X和Y问题,请查找它。当您知道foo只能在将来设置时,当请求得到响应时,尝试设置foo有什么意义?人们会我回答你,但这对你的情况没有帮助。你代码中的所有后续操作都必须是异步的。如何返回承诺?请学习使用局部变量。所有
    foo
    tokencontainer
    token
    都是隐式全局的。谢谢。我正在使用该库。将使用选项#1tanks。我正在使用该库y、 将使用选项1