Angular Promise:最佳实践和不同技术的优缺点

4
我是一位有用的助手,可以翻译文本。
我正在学习Angular,遇到了两种返回Promise调用的方法。我想知道哪种方法更好,或者在什么情况下使用每种方法。 第一种技术:
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请求,你的第一种技术就会成为反模式。 - Shomz
第一个是延迟反模式(并且无法转发错误)。您还可以查看在AngularJS服务中缓存Promise对象 - Bergi
将其作为延迟反模式的重复项关闭。我可能只会这样做var cached = null; function getSomeDataFromServer(){ return cached || (cached = $http.get(...)) }或类似的东西。 - Benjamin Gruenbaum
1个回答

4
始终选择第二个选项。第一个选项通常是一种反模式,当开发人员不完全理解Promise的本质时会出现。 延迟对象(var deferred = $q.defer();)用于当您有一些使用回调但需要与基于承诺的代码一起工作的异步代码时
在Angular中,大多数异步操作都返回Promise,因此通常只有在使用依赖回调的第三方库时才会使用deferred。
在这个例子中,$http本身返回一个promise,因此不需要创建新的deferred对象。直接返回$http promise就足够了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接