JS:异步api,最终结果总是空的

时间:2015-10-04 14:13:50

标签: javascript asynchronous google-chrome-extension

我正在使用异步服务并从中获取数据。这部分没问题,但是当我尝试设置这个数据然后从对象 - 空值。 请检查下面的代码,为什么getPage()返回false?

var PageName = function() {
    this.page = false;

    this.getPage = function() {
        return this.page;
    };

    this.setPage = function(pageId) {
        this.page = pageId;
        console.log(pageId); //Get correct result
    };

    this.savePage = function(callback) {
        chrome.storage.sync.get('pageId', function (obj) {
            pageId = obj.pageId;
            callback(pageId);
        });
    };
};

var page = new PageName();
page.savePage(page.setPage);

setInterval(function(){
    console.log(page.getPage()); //always get default result - false

}, 4000);

1 个答案:

答案 0 :(得分:2)

page.setPage需要绑定到页面。查看此网站上的第一个示例https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind 或者,您也可以根本不使用this。然后你不需要绑定该函数。 e.g。

var PageName = function() {
    var page = false;

    function getPage() {
        return page;
    }
    function setPage(pageId) {
        page = pageId;
    }
    function savePage(callback) {
        chrome.storage.sync.get('pageId', function (obj) {
            setPage(obj.pageId);
            callback(obj.pageId);
        });
    }

    return {
      getPage: getPage,
      setPage: setPage,
      savePage: savePage
    };
}

var page = PageName();
page.savePage(function(pageId) {
    console.log("pageId = " + pageId);
    console.log("page.getPage() = " + page.getPage());
});

在这个例子中,我也删除了setInterval的使用,因为我觉得它没有多大意义。 顺便说一句。这里有一些关于javascript对象创建模式的重复文章。 http://www.samselikoff.com/blog/some-Javascript-constructor-patterns http://www.codeproject.com/Articles/687093/Understanding-JavaScript-Object-Creation-Patterns