javascript – 使用chrome.storage.sync.get返回undefined返回值

前端之家收集整理的这篇文章主要介绍了javascript – 使用chrome.storage.sync.get返回undefined返回值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在构建Chrome扩展程序,我编写了此代码.
var Options = function(){};

Options.prototype = {

    getMode: function(){
               return chrome.storage.sync.get("value",function(e){  
                 console.log(e); // it prints 'Object {value: "test"}'.       
                 return e;
               });
    },setMode: function(){
        chrome.storage.sync.set({"value": "test"},function(e) {         
        })
    }
}

var options = new Options();
options.setMode();
console.log(options.getMode()); // it prints 'undefined'.

我期待它打印

Object {value: "set up"}

当我调用options.getMode()时,它会打印undefined.

有谁知道如何解决这个问题?

解决方法

chrome.storage API是 asynchronous – 它不直接返回它,而是将其作为参数传递给回调函数.函数调用本身总是返回undefined.

这通常用于允许其他方法运行而不必等到某些响应或完成 – 这个例子是setTimeout(唯一的区别是它返回一个计时器值,而不是未定义).

例如,拿这个:

setTimeout(function () { alert(1); },10000);
alert(0);

因为setTimeout是异步的,所以在整个函数完成之前它不会停止所有代码,而是最初返回,仅在稍后完成时调用函数 – 这就是为什么0在1之前出现的原因.

因此,您不能简单地执行以下操作:

// "foo" will always be undefined
var foo = asyncBar(function (e) { return e; });

通常,您应该在回调中放置您想要做的事情(异步函数完成时调用函数).这是编写异步代码的一种相当常见的方法

function getValue(callback) {
  chrome.storage.sync.get("value",callback);
}

您可以将整个代码部分放在回调中 – 没有什么可以阻止您这样做.所以不要做以下事情:

console.log(getValue()); // typical synchronous method of doing something

这可能是一个更好的主意:

// how it would be done in asynchronous code
getValue(function (value) {
  console.log(value);
});

猜你在找的JavaScript相关文章