javascript - 获取函数内异步函数的返回数据

boi*_*hos 6 javascript angularjs google-chrome-app

我有一个问题,因为chrome api函数是异步的,我不能得到它的返回值.请考虑以下代码.我正在使用angularjs

    $scope.storageGet = function(param) {
        var returnData; 

        chrome.storage.local.get(param.storageName, function(data) {
            returnData = data;
        });

        return returnData;
    };
Run Code Online (Sandbox Code Playgroud)

当我试图这样称呼时:

    console.log($scope.storageGet({'storageName': 'users'}));
Run Code Online (Sandbox Code Playgroud)

它在控制台中打印'undefined'.我想看到的是存储在chrome存储中的用户的对象.好吧,我确信我有chrome存储数据.

Tza*_*ach 7

您无法返回由异步函数生成的数据,例如chrome.storage.local.get,因为您的函数更有可能在执行异步函数之前完成执行.这就是你的函数返回的原因undefined,这是默认值returnData.

一个很好的选择是通过使用回调函数使您的函数同步.

$scope.storageGet = function(param, callback) {
    chrome.storage.local.get(param.storageName, function(data) {
        callback(data);
    });
};
Run Code Online (Sandbox Code Playgroud)

现在你可以这样调用你的函数:

$scope.storageGet(param, function(returnData) {
    // do something with returnData
});
Run Code Online (Sandbox Code Playgroud)


Rog*_*sen 6

另一种方法是使用承诺.在这种情况下,它可能无关紧要,但如果你有很多嵌套回调,那么承诺会更好.

$scope.storageGet = function(param) {
    var deferred = $q.defer();

    chrome.storage.local.get(param.storageName, function(data) {
        deferred.resolve(data);
    });

    return deferred.promise;
};
Run Code Online (Sandbox Code Playgroud)

然后你就这样称呼它.

$scope.storageGet(param).then(function (data) {

});
Run Code Online (Sandbox Code Playgroud)