【问题标题】:What $q.defer() really does?$q.defer() 真正做了什么?
【发布时间】:2014-03-01 22:53:54
【问题描述】:

我正在学习 Angular JS,目前我正在尝试了解 Promise 和异步编程,但我对 $q.defer() 有疑问。我的观点如下:通常当人们使用 Promise 时,他们会做类似的事情,考虑到 $q 已经可用

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

    /* Do things and if everything goes fine return deferred.resolve(result) 
       otherwise returns deferred.reject()
     */

    return deferred.promise;
}

这到底是在做什么?当我们执行var deferred = $q.defer() 时,它会立即将该函数的所有执行切换到另一个线程,并返回对仍在执行的该操作结果的引用的承诺?

这是我们在创建异步方法时应该考虑的方式吗?

【问题讨论】:

  • JavaScript 是单线程的(不包括网络工作者)
  • AngularJS API 中给出了非常好的解释 $q link

标签: angularjs asynchronous q


【解决方案1】:

使用 $q 可以异步运行函数。 延迟对象表示某事、某项任务已完成。

var defer = $q.defer();// we create deferred object, which will finish later.

defer.promise // we get access to result of the deferred task

.then( // .then() calls success or error callback
    function(param) {
        alert("i something promised " + param);
        return "something";
    }); // u can use 1 or more .then calls in row

 defer.resolve("call"); //returns promise

这里的例子: http://jsfiddle.net/nalyvajko/HB7LU/29048/

【讨论】:

    【解决方案2】:

    Angular 的 $q 服务基于 Javascript 库 Q。您可以在Q documentation 中阅读更多相关信息,或阅读github repo 中的代码。我认为从文档的介绍中摘录的这一部分解释得最好:

    如果函数不能返回值或抛出异常 阻塞,它可以返回一个承诺。 Promise 是一个对象 表示函数的返回值或抛出的异常 最终可能会提供。一个promise也可以用作一个代理 远程对象来克服延迟。

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2021-09-08
      • 1970-01-01
      相关资源
      最近更新 更多