4

我正在编写一个异步 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 可以快速返回数据。

我想用一个向调用者返回一个承诺对象的实现来替换这个实现。这个小提琴显示了示例实现 - http://fiddle.jshell.net/ZjUg3/44/

问题 - 由于 getData 可以快速返回,即使在调用者使用then方法建立处理程序链之前,getData 是否有可能解决承诺?只是为了模拟这一点,如果我在 setTimeout 函数中调用then方法(延迟为零),则不会调用回调。如果我在 setTimeout 函数之外调用then方法,则会调用回调。我不确定这是否是一个有效的问题或有效的用例。我对 angularjs 开发很陌生,希望能得到您的意见 :)

4

2 回答 2

5

如果您想getData()返回一个$q承诺而不是使用回调,我会使用$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;
    }
}
于 2014-01-22T20:40:40.147 回答
3

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

所有这一切都假设在 angularjs 的 promise 实现中没有错误/极端情况。如果它不起作用,那么它是一个错误。

如果您需要了解有关 Promises 如何工作的任何信息,您可以随时参考 Angular 所遵循的Promises/A+ 规范。作为规范,它是我遇到的最简单和最容易理解的规范之一(尽管我应该提到我已经参与规范很长一段时间了)。

于 2013-07-25T12:01:09.483 回答