【问题标题】:Angular Promises: Best Practices and Pros/Cons of Different Techniques [duplicate]Angular Promises:不同技术的最佳实践和优缺点
【发布时间】:2015-07-24 01:07:09
【问题描述】:

我正在学习 Angular,我遇到了两种方法来进行返回承诺的调用。我想知道一种方法是否比另一种更好和/或何时使用每种方法。

第一个技巧:

function getSomeDataFromServer() {
    var deferred = $q.defer();

    if (myData) {
        // call to backend was previously made and myData is already loaded 
        deferred.resolve(myData);
    } else {
        // get data from server
        $http.get(my_url_endpoint).then(function(response) {
            // cacheResult() will set myData = response.data
            deferred.resolve(cacheResult(response));
        });
    }

    return deferred.promise;
}

第二种技巧:

function getSomeDataFromServer() {

    if (myData) {
        // call to backend was previously made and myData is already loaded 
        return $q.when(myData);
    } else {
        // get data from server
        return $http.get(my_url_endpoint).then(function(response) {
            // cacheResult() will set myData = response.data
            return cacheResult(response);
        });
    }
}

【问题讨论】:

  • 不确定你的 getter 函数是否应该关心数据是否已经可用 - 听起来像控制器应该处理它。另一件事:如果浏览器缓存该 http 请求,您的第一种技术将成为反模式。
  • 第一个是deferred antipattern(并且无法转发错误)。您可能还想看看Caching a promise object in AngularJS service
  • 作为延迟反模式的副本关闭。我可能只会做var cached = null; function getSomeDataFromServer(){ return cached || (cached = $http.get(...)) } 或类似的事情。

标签: javascript angularjs promise angular-promise


【解决方案1】:

总是更喜欢第二个选项。第一个选项是一种反模式,通常在开发人员不完全理解 Promise 的性质时出现。使用延迟对象 (var deferred = $q.defer();) when you have some asynchronous code that uses callbacks but needs to work with your promise based code

您在 Angular 中执行的大多数异步操作都会返回 Promise,因此您通常只会在使用依赖回调的 3rd 方库时使用延迟。

在这个例子中,$http 本身返回了一个 promise,所以不需要创建一个新的延迟对象。返回 $http 承诺本身就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2020-12-22
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多