创建自己的angularjs $ q承诺

jca*_*314 4 angularjs angular-promise

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

该文档列出了我试图使用的$ 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
});
Run Code Online (Sandbox Code Playgroud)

而不是记录"这不会发生!" 接着是"伟大的",我实际上看到传递给$ q的函数记录::

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

谁能看到我做错了什么?

Zip*_*per 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")})
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 5

你什么都没做错。我真的不认为角度文档显示该代码并在其上方隐藏该行是不合适的:

虽然支持构造函数样式的使用,但并非ES6 Harmony promises的所有支持方法都可用。

如您所见,它引起了很多混乱。

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

var dfd = $q.defer();
Run Code Online (Sandbox Code Playgroud)

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

dfd.reject('some value');
dfd.resolve('some value');
Run Code Online (Sandbox Code Playgroud)