【发布时间】:2015-07-06 22:55:35
【问题描述】:
我用下面的代码创建了一个简单的例子。目标是能够使用来自 Angular 的 $q 服务的 deferred 承诺,但在回调中拥有 $q,该回调本身返回要在主控制器中处理的结果。
我认识到错误显然是$q 的承诺需要立即返回,以便它可以“等待”结果,并且将该承诺放在回调中会阻止它立即返回。因此,下面的代码显然是一个错误的策略。
我的问题是问什么是实现与上述愿望相当的实用程序的最佳实践,包括回调的存在和需要返回一个承诺。
function asyncGreet(name, cb) {
cb(name)
}
function okToGreet(name) {
return name.length > 10
}
var promise = asyncGreet('Robin Hood', function(name) {
var deferred = $q.defer();
setTimeout(function() {
deferred.notify('About to greet ' + name + '.');
if (okToGreet(name)) {
deferred.resolve('Hello, ' + name + '!');
} else {
deferred.reject('Greeting ' + name + ' is not allowed.');
}
}, 1000);
return deferred.promise;
});
promise.then(function(greeting) {
console.log('Success: ' + greeting);
}, function(reason) {
console.log('Failed: ' + reason);
});
【问题讨论】:
-
asyncGreet是故意同步调用它的回调吗? -
不回答您的问题,但将语法
if (name.length > 10) { return true } else { return false }替换为语法:return name.length > 10;。后者更性感:) -
@Bergi 用例使用的是
gapi,Google 的 OAuth 客户端库 (developers.google.com/api-client-library/javascript/reference/…)。我需要执行一些与该库相关的函数,其中涉及回调,然后将结果的各个方面发送到主控制器中的$scope。 -
在我看来,
checkAuth、handleClientLoad和handleAuthClick似乎都应该返回承诺。您应该 promisifygapi方法,然后永远不要在其他任何地方使用延迟。 -
@kuanb:不,你可以使用任何适合你的 Promise 库(嘿,它们是可互操作的!)。您可能想在您的情况下使用
$q承诺。
标签: javascript angularjs promise angular-promise