2016-04-11 4 views
0

Я пытаюсь создать расширение для браузера Chrome, которое отобразит уровень заряда батареи системы (и сделает пару других вещей) с помощью BatteryStatusAPI. Сначала я просто пытаюсь отобразите уровень заряда батареи с помощью простого холста, но он, похоже, не работает.BatteryStatus API для расширений Chrome не работает

манифеста:

{ 
    "manifest_version": 2, 

    "name": "Battery", 
    "description": "This extension shows the battery stats of the current device.", 
    "version": "1.0", 

    "browser_action": { 
     "default_icon": "battery_full.png", 
     "default_title": "Click Here!" 
    }, 

    "background": { 
     "scripts": ["icon_changer.js"] 
    } 
} 

JavaScript:

var battery; 
navigator.getBattery() 
    .then(function (b) { 
     battery = b; 
    } 
); 

function drawIcon() { 
    var clockCanvas = document.createElement("canvas"); 
    clockCanvas.height = 19; 
    clockCanvas.width = 19; 

    var clockContext = clockCanvas.getContext("2d"); 
    clockContext.textAlign = "center"; 
    clockContext.textBaseline = "middle"; 
    clockContext.font = "9px Arial"; 
    clockContext.fillText(battery.level, 9, 10); 

    chrome.browserAction.setIcon({ 
     imageData: clockContext.getImageData(0, 0, 19, 19) 
    }); 
} 

drawIcon(); 

Как вы думаете, проблема?

+1

Какова ценность функции b внутри функции обратного вызова? Добавьте 'console.log (b);' там. И прочитайте https://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron – rsanchez

+0

'Uncaught ReferenceError: b не определен '. Прочитав об асинхронном потоке, я до сих пор не понимаю, почему «getBattery()» не выполняется, как и весь асинхронный код. – galah92

+0

Нет, я имею в виду внутри 'function (b) {...}'. – rsanchez

ответ

0

Вы должны знать, для Navigator.getBattery().then(funcRef), funcRef является функция, которая будет вызвана, когда батарея promise возвращаемый navigator.getBattery получает решен. Из-за асинхронности, когда вы звоните drawIcon, getBattery(), возможно, не были разрешены, тогда funcRef не будет выполнен, что означает, что battery не определен.

Вы должны переместить drawIcon функция внутри funcRef.

var battery; 
navigator.getBattery() 
    .then(function (b) { 
     battery = b; 
     drawIcon(); 
    } 
); 

function drawIcon() { 
    // Your logic here 
}