2016-09-08 2 views
1

Я пытаюсь прочитать значения памяти браузера из Protractor и хранить их в глобальном объекте. Для этого я получаю объект window.performance.memory, а затем разрешаю обещание проверить каждое из значений памяти.Назначьте значение, возвращенное из обещания, к глобальной переменной

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

this.measureMemory = function() { 

    var HeapSizeLimit; 

    browser.driver.executeScript(function() { 
     return window.performance.memory; 
    }).then(function (memoryValues) { 
     HeapSizeLimit = memoryValues.jsHeapSizeLimit; 
     console.log('Variable within the promise: ' + HeapSizeLimit); 
    }); 
    console.log('Variable outside the promise: ' + HeapSizeLimit); 
}; 

Это возвращает:

Variable outside the promise: undefined 
    Variable within the promise: 750780416 
+3

Вы, безусловно, * можете * присваивать значение за пределами обещания в функции 'then', но вы не можете установить его до * в хронологическом порядке после того, как функция' then' действительно будет выполняться. – apsillers

+0

Спасибо @psillers. Это объяснение было очень полезно для понимания проблемы. – Tedi

ответ

4

Поскольку console.log('Variable outside the promise: ' + HeapSizeLimit); выполняется перед HeapSizeLimit = memoryValues.jsHeapSizeLimit;. Если он находится на линии после обещания, это не означает, что порядок выполнения одинаковый.

+0

Спасибо за помощь в понимании проблемы. – Tedi

1
// a variable to hold a value 
var heapSize; 

// a promise that will assign a value to the variable 
// within the context of the protractor controlFlow 
var measureMemory = function() { 
    browser.controlFlow().execute(function() { 
     browser.driver.executeScript(function() { 
      heapSize = window.performance.memory.jsHeapSizeLimit; 
     }); 
    }); 
}; 

// a promise that will retrieve the value of the variable 
// within the context of the controlFlow 
var getStoredHeapSize = function() { 
    return browser.controlFlow().execute(function() { 
     return heapSize; 
    }); 
}; 

В тесте:

it('should measure the memory and use the value', function() { 
    // variable is not yet defined 
    expect(heapSize).toBe(undefined); 
    // this is deferred 
    expect(getStoredHeapSize).toBe(0); 

    // assign the variable outside the controlFlow 
    heapSize = 0; 
    expect(heapSize).toBe(0); 
    expect(getStoredHeapSize).toBe(0); 

    // assign the variable within the controlFlow 
    measureMemory(); 

    // this executes immediately 
    expect(heapSize).toBe(0); 
    // this is deferred 
    expect(getStoredHeapSize).toBeGreaterThan(0); 
}; 

ничего не стоит: установка переменной и получения значения могут появиться происходить синхронно (за пределами ControlFlow) или асинхронно (с помощью отсроченных расстрелов в транспортир испытаний).

+0

Мне это нужно как глобальная переменная, которую я могу использовать для сравнения с предыдущими значениями. – Tedi

+0

Я пробовал это решение, но он возвращает: «Ожидаемое 0 больше 0.» – Tedi