AngularJS和Q.fcall

问题描述 投票:2回答:6

Angularjs qazxsw poi是受Kris Kowal的Q启发的承诺/延期实施。

在Q中,您创建了一个承诺

$q

这里将异步调用var myPromise = Q.fcall(myFunction); ,将承诺放在myFunction变量中并继续执行代码。

myPromise Angular用于创建一个承诺是使用javascript only example函数,对我来说,与上面的Q示例相比,这似乎是一个冗长的hack。所以在Angular我会写

timeout

以上内容与顶部的单线程相同。

我希望function asyncWorker(name) { var deferred = $q.defer(); setTimeout(function() { scope.$apply(function() { deferred.resolve(myFunction); }); }, 1000); return deferred.promise; } 能够奏效但我得到:

$q.fcall

那么在AngularJS中异步调用函数和返回promise的最简单方法是什么?

javascript angularjs promise q
6个回答
3
投票

你在寻找这样的东西吗?

TypeError: 'undefined' is not a function (evaluating '$q.fcall(function() { return 'a'; })')

现在你调用这个函数

function doWorkAsync() {
   var defer = $q.defer();
   //do some work async and on a callback 
   asyncWork(function(data)) {
      defer.resolve(data);
   }
   return defer.promise;
}

angularJS库函数的数量已经在调用时返回一个promise。像doWorkAsync().then(function(data)); $timeout$http


2
投票

我不知道这是否很聪明,但它对我有用:

$resource

1
投票

好吧,更清洁的替代方案是注入Angular的function fcall(someValues) { var deferrd = $q.defer(); deferrd.resolve(someValues); return deferrd.promise; } fcall(123).then(function(values) { console.log(values); // 123 }); ,让我们再说一下,函数$timeout是我想异步做的工作,我只会这样做:

myFunction

function doWorkAsync() { return $timeout(myFunction, 10); } 完成它的工作时,doWorkAsync将返回一个将被解决的承诺。

对于单元测试,我可以调用myFunction立即触发超时功能。


0
投票
$timeout.flush()

0
投票

您可以使用$ q作为类似于ES6工作方式的构造函数。

    function createPromise(func) {
        return function (params) {
            var deferred = $q.defer();

            $timeout(function () {
                try {
                    var rtn = func(params);
                    deferred.resolve(rtn);
                }
                catch (ex) {
                    deferred.reject();
                }

            })
            return deferred.promise
        }
    }

function asyncGreet(name) { return $q(function(resolve, reject) { resolve('Hello, ' + name + '!'); }); }


0
投票

你可以使用qazxsw poi来模仿qazxsw poi。它稍微冗长,但它的工作原理相同。

angular docs

其中Q.fcall(fn)可以是异步的,也可以是同步的,并且将使用未定义的参数调用。

工作范例:

$q.when().then(fn)

文档:var myPromise = $q.when().then(myFunction);

请注意,myFunction的工作原理与// Node.js var Q = require('q'); var updatePromise = Q.fcall(function() { if (isUpdate) { return doAsyncUpdate(); } else { return doSyncDelete(); } }).catch(function(err) { handleError(err); }); // AngularJS ['$q', function($q) { var updatePromise = $q.when().then(function() { if (isUpdate) { return doAsyncUpdate(); } else { return doSyncDelete(); } }).catch(function(err) { handleError(err); }); }] 相同。

© www.soinside.com 2019 - 2024. All rights reserved.