当前位置: 首页 > 面试题库 >

您可以在返回之前解决angularjs承诺吗?

岳安福
2023-03-14
问题内容

我正在尝试编写一个返回诺言的函数。但是有时候,所请求的信息会立即可用。我想将其包装在一个承诺中,这样消费者就不必做出决定了。

function getSomething(id) {
    if (Cache[id]) {
        var deferred = $q.defer();
        deferred.resolve(Cache[id]); // <-- Can I do this?
        return deferred.promise;
    } else {
        return $http.get('/someUrl', {id:id});
    }
}

并像这样使用它:

somethingService.getSomething(5).then(function(thing) {
    alert(thing);
});

问题在于,对于预解析的Promise不会执行回调。这是合法的事情吗?有没有更好的方法来处理这种情况?


问题答案:

简短的答案:是的,您可以 在返回AngularJS承诺之前将其解析,并且其行为将与您期望的一样。

来自JB
Nizet的Plunkr,
但经过重构后可以在最初提出的要求(即对服务的函数调用)的上下文中使用,并且可以在现场进行。

服务内部…

function getSomething(id) {
    // There will always be a promise so always declare it.
    var deferred = $q.defer();
    if (Cache[id]) {
        // Resolve the deferred $q object before returning the promise
        deferred.resolve(Cache[id]); 
        return deferred.promise;
    } 
    // else- not in cache 
    $http.get('/someUrl', {id:id}).success(function(data){
        // Store your data or what ever.... 
        // Then resolve
        deferred.resolve(data);               
    }).error(function(data, status, headers, config) {
        deferred.reject("Error: request returned status " + status); 
    });
    return deferred.promise;

}

控制器内部…

somethingService.getSomething(5).then(    
    function(thing) {     // On success
        alert(thing);
    },
    function(message) {   // On failure
        alert(message);
    }
);

希望对您有所帮助。我没有找到其他答案很清楚。



 类似资料:
  • 问题内容: 在我的应用程序中,我必须获取一些JSON数据并将其分配给数组,然后再加载页面。这是我使用CardService服务获取JSON的代码: 在控制器的resolve块中,我具有以下内容: 在实际的控制器中,我有以下内容: 问题是,服务中的fetchCards函数似乎在将JSON数据分配给cards变量之前就解决了诺言。这导致我的视​​图中加载了空白数据,直到刷新两次并很幸运为止。 我可以确

  • 问题内容: 使用node.js版本7.7.2,我要执行一个异步函数,然后在第一个函数完成后执行另一个函数,如下所示: 问题是此安装程序打印“栏已被开除”,然后打印“foo将要解决”。我期望的是,bar将等待触发,直到foo返回的promise被解决为止。我是否误解了then()如何将回调在node.js事件循环中排队? 谢谢 问题答案: 如注释中所述,将一个函数传递给该函数,当该函数被调用时,将使

  • 问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困

  • 问题内容: 无论我的Promise是否成功解决,我都想执行相同的操作。我不想将相同的功能绑定到两个参数。没有像jQuery一样的东西吗?如果没有,我该如何实现? 问题答案: 没有像jQuery一样的东西吗? 如果没有,我该如何实现? 您可以这样实现自己的方法: 或更广泛地讲,将解析信息传递给回调: 两者都确保原始解析得以维持(当回调中没有异常时),并确保等待诺言。

  • 问题内容: 我的服务是: 我通过以下方式在我的文件中调用它: 但是,它抱怨这不是一个功能。我不退还已解决的承诺吗? 问题答案: 从您的服务方式: 在您的控制器中:

  • 问题内容: AngularJS文档说: $ qpromise由模板引擎以角度识别,这意味着在模板中,您可以将附加到作用域的promise视为它们的结果值。 所以有人可以解释一下这种提琴无法正常工作的原因吗?不可能更改文本字段的值。但是分配保证$http服务返回作用域字段的工作就像一个超级按钮。 控制器: HTML: 问题答案: 您需要在promise对象上使用then()函数: 就您而言,我认为您