创建自己的angularjs $ q承诺

时间:2014-12-15 17:54:24

标签: angularjs angular-promise

此示例尝试使同步代码异步。我发现的所有例子都是相反的,除了docs.angularjs.org .. $ q下面的主要第一个例子。

doc列出了我试图使用的$ q构造函数。不幸的是,jsfiddle Angular库1.1.1和1.2.1提供了一个$ q对象(不是函数),如本例所示。相反,我必须提供我的例子,并希望有人能看到这个错误。

https://docs.angularjs.org/api/ng/service/ $ Q

我需要看到“这不会发生!”要执行的行。

f = function(name) {
    return $q(function(resolve, reject) {
        console.log "this does not happen!"
        resolve('great')
    });
}


f(name).then(function(result) {
  console.log 'result', result
}, function(error) {
  console.log 'error', error
});

而不是记录“这不会发生!”接着是“很棒”,我实际上看到函数传递给$ q logged ::

    result function(resolve, reject) {
        console.log "this does not happen!"
        resolve('great')
    }

有人能看到我做错了吗?

2 个答案:

答案 0 :(得分:5)

有点难以确切地看到您正在尝试的内容,但这里有一些我们使用的可能有用的代码。

f = function(someValue){
    var deferred = $q.defer();
    doSomethingAsync(someValue, function(result){ return deferred.resolve(result)});
    return deferred.promise;
}

f("foo").then(function() {alert("I was called after the async thing happened")})

答案 1 :(得分:5)

你没有做错任何事。我并不认为角度文档显示隐藏在它上面的代码的代码是合适的:

  

虽然支持构造函数样式的使用,但不是全部   ES6 Harmony承诺的支持方法尚可。

正如你所见,这会造成很多混乱。

使用构造函数方法(如Zipper发布的)

var dfd = $q.defer();

然后您可以执行以下操作:

dfd.reject('some value');
dfd.resolve('some value');