将嵌套的promises返回给另一个函数

时间:2018-04-18 01:48:17

标签: javascript node.js

我有一个NodeJS应用程序,我认为从嵌套的Promise内部返回时遇到问题。

如下所示,getToken功能正在运行。它调用另一个函数来检索密码。在此之后,它在进行GET调用时使用密码值。

然后我们成功获取令牌,然后将body打印到控制台。这有效。

但是,我现在面临的挑战是将body的值作为我的令牌传递给另一种方法以供以后使用。 printBodyValue当前失败并因“未定义”错误而失败。

如何将值从getToken深处传递到printBodyValue

getToken: function() {
   module.exports.readCredentialPassword()
 .then(result => {
     var request = require('request-promise');
     var passwd = result;
     var basicAuthData = "Basic " + (new Buffer("fooUser" + ":" + passwd).toString("base64"));
     var options = {
        method: "GET",
        uri: ("http://localhost:8001/service/verify"),
        followRedirects: true,
        headers: {
          "Authorization": basicAuthData
        }
     };
     return request(options)
       .then(function (body) {
         console.log("Token value is: ", body);
         return body;
       })
       .catch(function (err) {
         console.log("Oops! ", err);
       });
   });
}

printBodyValue: function() {
   module.exports.getToken().then(function(body) {
    console.log("Token value from printBodyValue is: \n", body);
   });
}

1 个答案:

答案 0 :(得分:1)

getToken中,不是使用嵌套的promise反模式,而是链接你的promises,并返回最终的promise,这样你就可以使用promise并使用它的已解析值:

(另外,因为您使用的是ES6,所以更喜欢const而不是var

getToken: function() {
  return module.exports.readCredentialPassword()
    .then(result => {
      const request = require('request-promise');
      const passwd = result;
      const basicAuthData = "Basic " + (new Buffer("fooUser" + ":" + passwd).toString("base64"));
      module.exports.log("Sending Request: ", jenkinsCrumbURL);
      const options = {
        method: "GET",
        uri: ("http://localhost:8001/service/verify"),
        followRedirects: true,
        headers: {
          "Authorization": basicAuthData
        }
      };
      return request(options);
    })
    .then(function(body) {
      console.log("Token value is: ", body);
      // the return value below
      // will be the final result of the resolution of
      // `module.exports.readCredentialPassword`, barring errors:
      return body;
    })
    .catch(function(err) {
      console.log("Oops! ", err);
    });
}

printBodyValue: function() {
  module.exports.getToken().then(function(body) {
    console.log("Token value from printBodyValue is: \n", body);
  });
}