Невозможно сохранить значение в глобальной переменной от анонимной функции - Javascript и Protractor - PullRequest
0 голосов
/ 06 января 2019

Я пишу сценарии для транспортировщиков. Моя проблема в том, что я не могу сохранить значение в глобальных переменных. Ни в global.somevariable, ни в browser.params.somevariable.

У меня есть 2 файла: 1. login.js 2. helper.js

Из анонимного метода, который находится внутри файла helper.js, я пытаюсь сохранить значение в глобальной переменной. Я вызываю этот связанный с helper.js метод из файла js, который является файлом PageObject.

В config.js я объявил 2 переменные - одну с глобальным ключевым словом. Второй - с методом onPrepare (), поэтому я могу использовать browser.params.someVar. Однако ничего не работает.

Внутри этого метода значения внутри vairables в порядке. Однако, когда я обращаюсь к тем же переменным вне этого helper.js, они имеют значение null / не правильно.


config.js

exports.config =
{
  params: 
    {
      tempVar:false
    },

  onPrepare:function()
    {
      global.result=false;  
    }
};

loginpage.js

var loginPage = function() 
{
    var un = element(by.id('un'));
    var helper = new help();

    helper.verifyElemExists(un);  
    console.log(global.result);//False,though promise returned true 
    console.log(browser.params.tempVar); // This is also false
    if(global.result===true)
     {
      // Code will do something...
     }
}
module.exports =   login; 

helper.js

var helper  = function()
{
  verifyElemExists = function(elem)
  {        
   elem.isPresent().then(function(res)
   {  
     browser.params.tempVar=res;
     global.result =res;             
   }); 
}
module.exports =   helper;  

1 Ответ

0 голосов
/ 07 января 2019

Вам необходимо знать процесс выполнения скриптом транспортира nodejs. Основной причиной вашей проблемы является следующий фрагмент кода:

helper.verifyElemExists(un);  
// when nodejs execute above line, all promises generated in this function 
// will be added into a list (you can call the list as protractor control flow),
// after all sync script be executed, the protractor control flow start to execute 
// the promise in the list one by one in the order as they are added into list.

console.log(global.result); 
console.log(browser.params.tempVar);
if(global.result===true)
{
  // Code will do something...
}
// when nodejs execute above lines, because all of them are sync script,
// the execution result of then return immediately, and at the time point they are executed, 
// the promise of `helper.verifyElemExists(un);`
// have not start to execute(or not complete execute), 
// thus the `global.result` and `browser.params.tempVar` are still with init value: false

Из приведенного выше процесса выполнения сценария транспортира можно видеть, что после завершения выполнения обещания и кода синхронизации будет создан список обещаний для кода обещания, но не для кода синхронизации. Затем обещания в списке выполняются.

Чтобы устранить проблему, вы можете заключить приведенный выше код синхронизации в обещание, чтобы они выполнялись после обещания, сгенерированного в helper.verifyElemExists(un);

helper.verifyElemExists(un); 

// browser.getTitle() is a promise which be added into promise list after
// helper.verifyElemExists(un);
browser.getTitle().then(function(){
    console.log(global.result); 
    console.log(browser.params.tempVar);
    if(global.result===true)
    {
      // Code will do something...
    }
})


// or change the `helper.verifyElemExists()` to return a promise
var helper  = function()
{
  verifyElemExists = function(elem)
  {        
   return elem.isPresent().then(function(res)
   {  
     browser.params.tempVar=res;
     global.result =res;             
   }); 
}
module.exports = helper;


helper.verifyElemExists(un).then(function(){
    console.log(global.result); 
    console.log(browser.params.tempVar);
    if(global.result===true)
    {
      // Code will do something...
    }   
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...