量角器中 API 响应后的 JS 变量未定义错误

JS variable undefined error after the API response in protractor

我需要对 API 响应中的响应执行操作。我能够处理响应以获得所需的结果。但是当我试图在该函数之外获取变量时,我得到的变量是未定义的。我需要 return 函数中的变量。 我的代码

  RetrieveLatestRunIDFromTestSuiteDetails : async function(Project, TestEnvironment, JenkinsJob, TestExecutionID) {
  
        var testSuiteStatuses ;
        var input={
                 "jenkinsJob": JenkinsJob,
                 "project": Project,
                 "testEnvironment": TestEnvironment,
                 "TestExecutionID":TestExecutionID
             };
             const data=JSON.stringify(input);
             const options= {
                 host: host,
                 path: '/api/db/getRunIDFromTestSuiteDetails',
                 method: 'PUT',
                 headers: {
                     'Content-Type': 'application/json'
                 }
             }
             const request = await https.request(options, (res) => {
                 console.log(`statusCode from RetrieveLatestRunIDFromTestSuiteDetails ::  ${res.statusCode}`);
                 
                 res.on('data', (d) => {

                     process.stdout.write("Response Data from RetrieveLatestRunIDFromTestSuiteDetails:: " + d);
                     var jsonobj=JSON.parse(d);
                     testSuiteStatuses=jsonobj["buildID"];
                     console.log("build id number:"+testSuiteStatuses);                                       
                       
                 })           
                
            })           
             console.log("test suite number that needs to return:"+testSuiteStatuses);
             request.write(data);
             request.end();
             return testSuiteStatuses; 
           
        }

在控制台上我得到

test suite number that needs to return:undefined
statusCode from RetrieveLatestRunIDFromTestSuiteDetails ::  200
Response Data from RetrieveLatestRunIDFromTestSuiteDetails:: {"buildID":48}build id number:48

需要 return 的测试套件编号在任何其他语句之前执行。 有人可以帮我 return 变量“testSuiteStatuses”。

感谢您的帮助。

谢谢

你需要做两件事。首先,将整个函数包装在一个 Promise 中。其次,将您的 return 语句移至 res.on('end', () => {}) 并解析其中的值。请注意,我还从您的函数中删除了 async/await 。这里不需要。

RetrieveLatestRunIDFromTestSuiteDetails : function(Project, TestEnvironment, JenkinsJob, TestExecutionID) {
  return new Promise((resolve, reject) => {
    let testSuiteStatuses;
    const input = {
      "jenkinsJob": JenkinsJob,
      "project": Project,
      "testEnvironment": TestEnvironment,
      "TestExecutionID":TestExecutionID
    };

    const data=JSON.stringify(input);

    const options= {
      host: host,
      path: '/api/db/getRunIDFromTestSuiteDetails',
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json'
      }
    };

    const request = https.request(options, (res) => {
      console.log(`statusCode from RetrieveLatestRunIDFromTestSuiteDetails ::  ${res.statusCode}`);

      res.on('data', (d) => {

        process.stdout.write("Response Data from RetrieveLatestRunIDFromTestSuiteDetails:: " + d);
        var jsonobj=JSON.parse(d);
        testSuiteStatuses=jsonobj["buildID"];
        console.log("build id number:"+testSuiteStatuses);

      });

      res.on('end', () => {
        console.log("test suite number that needs to return:"+testSuiteStatuses);
        resolve(testSuiteStatuses);
      });

    });

    request.write(data);
    request.end();
  });
}