初学者异步JS - 我是否必须使用"然后"每次我想要的价值

时间:2015-03-31 08:30:29

标签: javascript asynchronous promise

我正在使用异步的PouchDB,我是async的新手。

因此,如果我从pouchdb获取文档,我必须使用.then来查看实际结果。多数民众赞成在我看来,但我每次想要这个价值时都要拨打.then吗?

例如,我创建了一个SettingsService,我可以存储我的设置键/值样式。

// Get Setting
settingsService.get = function(key) {
    return settingDB.get(key).catch(function (err) {
        console.log(err);
    });
};

当我想要获得设置时,我必须每次都进行这个大.then块吗?

// Get Time of Last Sync
settingsService.get('lastSync').then(function (setting) {
    $scope.lastSync = setting.value;   // now it's assigned isn't it?
    console.log(setting);
});

//edit, but this is still is undefined.. so again use then?
console.log($scope.lastSync);

现在,如果我想在代码中稍后再次使用相同的设置,我每次都要重复这个.then的内容吗?

1 个答案:

答案 0 :(得分:1)

是的,如果您尝试访问当前then块之外的任何值,则需要then

// Get Time of Last Sync
settingsService.get('lastSync').then(function (setting) {
    $scope.lastSync = setting.value;
    console.log(setting);

   // inside the then function, you can access the $scope.lastSync variable directly

});

您要对$scope.lastSync执行的任何操作都必须在此函数内。否则,您甚至可以使用$scope.$watch(lastSync, function(newValue){})来处理then函数之外的内容。这将确保它在值更改后运行,并且再次类似于then

但在then之外,您必须使用then,因为您不知道该值何时会解决。

console.log($scope.lastSync);之外的任何地方then都会给你未定义的内容。您可以使用$timeout来执行console.log,但无法保证何时可以使用该值。这完全取决于服务电话。

虽然你已经在当时分配了它,但then将在服务调用成功的某个时间点执行。但是你要立即打印$scope.lastSync的console.log。所以它仍然是undefined因为then回调尚未执行。