【问题标题】:Node js restler returns the same result when making 2 different API requestsNode js restler 在发出 2 个不同的 API 请求时返回相同的结果
【发布时间】:2018-04-10 21:47:09
【问题描述】:

我正在尝试使用 restler 和量角器获取网站的 API,但是当我发出 2 个单独的 API 请求时,它会两次返回第一个请求的结果。

我的功能:

var url = undefined;
var rest = require('restler');
var defered = protractor.promise.defer();

var getDataFunction = function() {
  var url = 'https://example.api.testlodge.com/v1/projects/16702/runs/287053/executed_steps.json?page=1'

  rest.get(url, {
    headers: {
      'Connection': 'close'
    }
  }).on('complete', function(result) {
    if (result instanceof Error) {
      console.log('Error:', result.message);
      defered.reject(result.message);
      //this.retry(5000); // try again after 5 sec 
    } else {
      defered.fulfill(result);
      defered.promise.then(function(item) {
        console.log("fulfill", item);
      });
    }
  });
  return defered.promise;
};


var get2ndDataFunction = function() {

  rest.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22Hyderabad%2C%20Tel%2C%20india%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys', {
    headers: {
      'Connection': 'close'
    }
  }).on('complete', function(result) {
    if (result instanceof Error) {
      console.log('Error:', result.message);
      defered.reject(result.message);
      //this.retry(5000); // try again after 5 sec 
    } else {
      defered.fulfill(result);
      defered.promise.then(function(item) {
        console.log("fulfill", item);
      });
    }
  });
  return defered.promise;
}

然后:

getDataFunction().then(function() {

  get2ndDataFunction();


});

运行上述脚本后的结果:

fulfill { pagination: { total_entries: 22, total_pages: 2, current_page: 1, next_page: 2, previous_page: null, per_page: 20 }, executed_steps: [ { id: 12712861, step_number: 'TC01', title: 'User should be able to view agent profile', description: 'Prerequisite:
\r\nUser is on the agent page, test_steps: '1. Ensure The following are present:\r\n\r\nAgent Image\r\nMobile Phone(mandatory)\r\nAfter Hours\r\nPhone\r\nProfile text\r\nRecommendations (if applicable)', expected_result: 'User is able to view the agent
image, contact details and the profile text and/or recommendations', stored_custom_fields: [Object], actual_result: null, passed: 1, issue_tracker_ticket_number: null, position: 1, run_id: 287053, run_section_id: 375586, last_saved_by_id: 34400, custom_fields:
[], created_at: '2017-10-24T20:38:06.000Z', updated_at: '2017-10-27T04:22:20.000Z' }, 

fulfill { pagination: { total_entries: 22, total_pages: 2, current_page: 1, next_page: 2, previous_page: null, per_page: 20 }, executed_steps: [ { id: 12712861, step_number:
'TC01', title: 'User should be able to view agent profile', description: 'Prerequisite: \r\nUser is on the agent page, test_steps: '1. Ensure The following are present:\r\n\r\nAgent Image\r\nMobile Phone(mandatory)\r\nAfter Hours\r\nPhone\r\nProfile text\r\nRecommendations
(if applicable)', expected_result: 'User is able to view the agent image, contact details and the profile text and/or recommendations', stored_custom_fields: [Object], actual_result: null, passed: 1, issue_tracker_ticket_number: null, position: 1, run_id:
287053, run_section_id: 375586, last_saved_by_id: 34400, custom_fields: [], created_at: '2017-10-24T20:38:06.000Z', updated_at: '2017-10-27T04:22:20.000Z' },

预期结果:

fulfill { pagination: { total_entries: 22, total_pages: 2, current_page: 1, next_page: 2, previous_page: null, per_page: 20 }, executed_steps: [ { id: 12712861, step_number: 'TC01', title: 'User should be able to view agent profile', description: 'Prerequisite:
\r\nUser is on the agent page, test_steps: '1. Ensure The following are present:\r\n\r\nAgent Image\r\nMobile Phone(mandatory)\r\nAfter Hours\r\nPhone\r\nProfile text\r\nRecommendations (if applicable)', expected_result: 'User is able to view the agent
image, contact details and the profile text and/or recommendations', stored_custom_fields: [Object], actual_result: null, passed: 1, issue_tracker_ticket_number: null, position: 1, run_id: 287053, run_section_id: 375586, last_saved_by_id: 34400, custom_fields:
[], created_at: '2017-10-24T20:38:06.000Z', updated_at: '2017-10-27T04:22:20.000Z' },


{"query":{"count":1,"created":"2017-10-29T23:48:57Z","lang":"en-GB","results":{"channel":{"units":{"distance":"mi","pressure":"in","speed":"mph","temperature":"F"},"title":"Yahoo! Weather - Hyderabad, Telangana.......

我不确定是 Restler 还是 promise 问题。

【问题讨论】:

    标签: javascript protractor restler


    【解决方案1】:

    下面是答案;

    var url = undefined;
    var rest = require('restler');
    
    
    var getDataFunction = function() {
      var defered = protractor.promise.defer();
      var url = 'https://example.api.testlodge.com/v1/projects/16702/runs/287053/executed_steps.json?page=1'
    
      rest.get(url, {
        headers: {
          'Connection': 'close'
        }
      }).on('complete', function(result) {
        if (result instanceof Error) {
          console.log('Error:', result.message);
          defered.reject(result.message);
          //this.retry(5000); // try again after 5 sec 
        } else {
          defered.fulfill(result);
          defered.promise.then(function(item) {
            console.log("fulfill", item);
          });
        }
      });
      return defered.promise;
    };
    
    
    var get2ndDataFunction = function() {
      var defered2 = protractor.promise.defer();
    
      rest.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22Hyderabad%2C%20Tel%2C%20india%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys', {
        headers: {
          'Connection': 'close'
        }
      }).on('complete', function(result) {
        if (result instanceof Error) {
          console.log('Error:', result.message);
          defered2.reject(result.message);
          //this.retry(5000); // try again after 5 sec 
        } else {
          defered2.fulfill(result);
          defered2.promise.then(function(item) {
            console.log("fulfill", item);
          });
        }
      });
      return defered2.promise;
    }

    那么;

    getDataFunction().then(function() {
    
      get2ndDataFunction();
    
    
    });

    【讨论】:

      【解决方案2】:

      protractor.promise 是一个暴露的 selenium-webdriver 命名空间,我相信 defer 方法自 selenium-webdriver 3 以来已被弃用。未显示您使用的 Protractor 版本。请查看selenium-webdriver changelog。 Protractor 在 Protractor 5 中使用this commit 进行了这些更改。

      【讨论】:

      • 感谢 cnishina!我发现了问题所在。 “var defered = protractor.promise.defer()”已在全球范围内声明。它应该在每个函数中声明。在我在本地声明变量后它起作用了。例如。 var getDataFunction = function() { var defered = protractor.promise.defer()"; .......... } var get2ndDataFunction = function() { var defered2= protractor.promise.defer()" ; ..................... }
      • 酷!好吧,如果我的不是答案,你能提供这个问题的实际答案吗?它没有隐藏在评论中那么明显。谢谢
      • 没问题! @cnishina,我已经添加了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多