Javascript Promises返回奇怪的对象

时间:2015-09-01 04:00:46

标签: javascript promise google-chrome-app

(function() {
"use strict";

var storage = chrome.storage.sync;
var localStorage = null;

function getOutsideScope(property) {
    if (localStorage.hasOwnProperty(property)) {
        return localStorage[property];
    }
}

function fulfill(data) {
    return data;
}

function rejected(err) {
    log(err);
}

window.app.storage = {
    get: function(storageKey, storageProp) {
        var promise = new Promise(function(fullfill, reject) {
            chrome.storage.sync.get(storageKey, function(data) {
                if (data.hasOwnProperty(storageKey)) {
                    fullfill(data[storageKey]);
                } else {
                    reject(new Error(storageKey + " does not exist in the storage values."));
                }
            });
        });
        return promise.then(fulfill, rejected);
    },
    set: function(storageKey, storageItem) {

    },
    onChanged: function(fn) {

    }
};

})();

所以上面是我用于镀铬存储的IIFE封装器,并且返回是哔哔声的痛苦。所以我决定试试Promise,这是我的第一次,所以不要对我这么粗暴。基本上这就是我想做的事情

 var property = app.storage.get("properties");
 //property should equal "value"
 //except it returns undefined 

所以添加承诺它会获得值,除非它返回

Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "value"}

我做错了Promises我已经尝试过阅读HTML5Rocks,MDN和视频教程,除了它并没有真正提到如何返回一个值。这可以工作

get:function(storageKey,storageProp) {
    chrome.storage.sync.get(storageKey,function(data) {
        //for simplicity and no error checking -_-
        return data[storageKey];
    });
}

1 个答案:

答案 0 :(得分:2)

该函数返回它应该返回的内容:一个承诺。要在履行承诺后获得,您可以通过.then添加回调:

app.storage.get("properties").then(function(property) {
    // property will be "value"
});

来自MDN

  

Promise表示创建promise时未必知道的值的代理。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这允许异步方法返回类似于同步方法的值:异步方法返回一个承诺,即在将来的某个时刻获得一个值,而不是最终值。

     

[...]

     

待处理的承诺可以使用值来实现,也可以因某个原因而被拒绝(错误)。当其中任何一个发生时,将调用由promise的then方法排队的关联处理程序。