繁体   English   中英

从一个能够很快解决这个承诺的函数中返回角度承诺

[英]Returning angular promise from a function that resolves the promise very quickly

我正在编写一个异步的javascript函数,消费者会调用​​它来获取某些数据。 以下是我最初编写的简单实现(为了清楚起见,错误处理和其他内容被删除)。

function getData(callback){
    if (data is available as a JavaScript object){
        callback(data);
    }else{
        getAsyncData(function(data){
             //some transformations on data
             callback(data); 
        });
    }
}

需要注意的重要一点是,如果数据已作为JavaScript对象可用,则getData可以快速返回数据。

我想将此实现替换为将一个promise对象返回给调用者的实现。 这个小提琴显示了示例实现 - http://fiddle.jshell.net/ZjUg3/44/

问题 - 因为getData可以快速返回,即使在调用者使用then方法建立处理程序链之前,getData是否有可能解析 promise? 只是为了模拟这个,如果我在setTimeout函数中调用then方法(零延迟),则不会调用回调函数。 如果我在setTimeout函数之外调用then方法,则调用callback。 我不确定这是否是一个有效的关注或有效的用例。 我是angularjs开发的新手,非常感谢你的观点:)

如果你想让getData()返回一个$q promise而不是使用回调,我会使用$q.when()和通常的$q.resolve()来执行以下重构:

function getData()
{
    if (data is available as a JavaScript object) {
        return $q.when(data); // resolves immediately
    } else {
        var q = $q.defer();
        getAsyncData(function(data){
             //some transformations on data
             q.resolve(data); 
        });
        return q.promise;
    }
}

不,作为承诺的一个重要而重要的部分是,当您附加处理程序时无关紧要。 即使您现在创建了一个承诺并立即解决它,然后让您的计算机在接下来的50年内继续运行,然后附加一个它仍将触发的处理程序。

所有这一切都假设angularjs的promise实现中没有bug / corner案例。 如果它不起作用,那它就是一个bug。

如果您需要了解Promises如何工作,您可以随时参考Promises / A +规范哪个角度adheers。 作为一个规范,它是我遇到的最简单和最容易理解的一个(虽然我应该提到我已经参与了规范很长一段时间了)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM