量角器:尝试 return 值时变得不确定

Protractor: Getting undefined while trying to return a value

我编写了一个发送 GET 请求和 returns 响应的函数。

this.generateToken = function() {
    var options = {
       uri: 'http://localhost:10000/token',
       method: 'GET',
       headers: {
         'Authorization': "YWRtaW46YWRtaW4="
       },
    };
    request(options, function (error, response, body) {
       var messageresponse = response.body.toString();
       console.log(messageresponse); //I am able to print the response
       return messageresponse;
    });
};

我能够在 request() 中打印 'messageresponse' 变量的值。
这个函数是从我的一个测试中调用的:

it('Post a GET request and generate a response', function () {
    var response = commonFunctionObj.generateToken();
    response.then(function(value){     //Getting below mentioned error on this line
       console.log(value);
    });
});

出现错误:TypeError: Cannot read property 'then' of undefined 在调用函数中。
有人可以帮忙吗?

需要在回调函数中写打印响应逻辑,用于解析promise或者处理异步行为

 Code  Snippet:

   it('Post a GET request and generate a response', function () {
      var response = commonFunctionObj.generateToken(function(err,res){ 
                            res.then(function(value){
                                 console.log(value); //or return  value
                         });
                });
    });

我觉得你可以按照下面的方式来做;

this.generateToken = function() {
  var deferred = protractor.promise.defer();

  var options = {
   uri: 'http://localhost:10000/token',
   method: 'GET',
   headers: {
     'Authorization': "YWRtaW46YWRtaW4="
   },
  };
  request(options, function (error, response, body) {
   var messageresponse = response.body.toString();

   deferred.fulfill(messageresponse);
  });

  return deferred.promise;
};


it('Post a GET request and generate a response', function () {
    var response = commonFunctionObj.generateToken();
    response.then(function(value){     //Getting below mentioned error on this line
       console.log(value);
    });
});

说明;

您不能将 .thengenerateToken 的 return 一起使用。因为那个函数里面没有 return 。您需要承诺 (protractor.promise) 以便在其中使用 then。然后,您可以使用 .then 和 generateToken 函数。

您需要创建一个承诺并解决一次才能收到响应。 看下面的代码。

this.generateToken = function() {
var deffered = protractor.promise.defer(); //create a promise
var options = {
   uri: 'http://localhost:10000/token',
   method: 'GET',
   headers: {
     'Authorization': "YWRtaW46YWRtaW4="
   },
};
  request(options, function (error, response, body) {
     var messageresponse = response.body.toString();
     console.log(messageresponse); 
     deffered.fulfill(messageresponse); //Instead of returning the response message, fulfill the promise that we created early.
  });

return deffered.promise; //return the created promise.
};

现在您可以在您的任何测试中调用 generateToken() 方法,该方法将 return 只有在从 API 调用收到响应时才解析的承诺。

it('Post a GET request and generate a response', function () {
     var response = commonFunctionObj.generateToken(); 
     response.then(function(value){   
     console.log(value);
    });
});