Angularjs 承诺链和处理承诺链中不返回任何内容的行为

Angularjs 承诺链和处理承诺链中不返回任何内容的行为,angularjs,angular-promise,Angularjs,Angular Promise,我有一个关于Javascript承诺链接的问题。假设我在承诺链的某个地方有一个行动。该操作不会返回任何值,但必须在链继续之前完成 我需要用承诺来包装这一行动吗?我需要像这样的东西吗 $q.when(); 请参见下面的我的代码: ... var goToDashboard = function () { //TODO: use $q here? $state.go('dashboard'); }; ... activateEmail().then(signinByToken).t

我有一个关于Javascript承诺链接的问题。假设我在承诺链的某个地方有一个行动。该操作不会返回任何值,但必须在链继续之前完成

我需要用承诺来包装这一行动吗?我需要像这样的东西吗

$q.when();
请参见下面的我的代码:

...
var goToDashboard = function () {
    //TODO: use $q here?
    $state.go('dashboard');
};
...
activateEmail().then(signinByToken).then(setPersonalInfo).then(goToDashboard).then(somethingElse).catch(reportProblem);

有人能给我一些建议吗?

我想我已经找到了问题的答案

首先,我们需要考虑这样一个事实,
then()
,引用文档,返回一个新的承诺,该承诺通过回调的返回值来解决

见下文:

然后(successCallback、errorCallback、notifyCallback)–不管 当承诺被或将被解决或拒绝时,则调用一个 一旦结果出现,成功或错误的消息将立即异步回调 有空。调用回调时使用一个参数: 结果或拒绝原因。此外,通知回调可能是 调用零次或多次以提供进度指示,然后 承诺被解决或拒绝

此方法返回一个新的承诺,该承诺通过 successCallback的返回值errorCallback(除非 价值是一种承诺,在这种情况下,它与 使用承诺链在该承诺中解决)。它还通知 通过notifyCallback方法的返回值。承诺是不可能的 无法从notifyCallback方法中解析或拒绝

因此,我假设下面的回调(确实显式返回了一些内容)将只返回
未定义的
本身,并通过
then()
封装成一个承诺:


所以我有一个承诺-感谢
then()
-我不需要任何其他东西…

在下面我演示了链接
。然后
使用各种函数的承诺和其他返回类型。当然,如果不返回承诺,就不会有延迟的解析,下面的
。然后
会立即执行-因此,如果您有一些异步任务需要完成,则需要返回一个承诺,在异步任务完成时解析。请注意,返回
$q.when()
确实会返回一个承诺(围绕作为参数提供的任何内容),但它会立即得到解决

还有,请注意!因此,在上面的示例中,您可以
返回$state.go('dashboard')
和下面的
。然后在ui路由器更改路由(如下所示)之前不应执行

(函数(){
“严格使用”;
angular.module('myApp',['ui.router','ngResource']))
.controller('myController',['$scope','$state','$q','$timeout','$resource','$log',myController])
.config(['$stateProvider',configUiRouter]);
函数configUiRouter($stateProvider){
$stateProvider
.州(“家”{
网址:“/home”,
模板:“母国”
})
.state(“仪表板”{
url:“/dashboard”,
模板:“仪表板状态”
})
.state(“错误”{
url:“/错误”,
模板:“错误状态:对不起,戴夫,恐怕我做不到……”
});
}
函数MyController($scope、$state、$q、$timeout、$resource、$log){
$scope.status={
电子邮件激活:false,
signinByToken:错,
personalInfo:false,
stackoverflowUsers:null,
加载:null,
柜台:0
};
$state.go('home');//设置ui路由器测试的默认状态
activateEmail()
.then(updateStatusLoading).then(计数)//加载:。计数器:1
.然后(签名)
.then(updateStatusLoading).then(计数)//加载:…计数器:2
.然后(设置个人信息)
.then(updateStatusLoading).then(计数)//加载:…计数器:3
.然后(goToDashboard)
.then(updateStatusLoading).then(计数)//加载:……计数器:4
.然后(某件事)
.然后(触发错误)
.然后(再也不用说了)
.catch(catcherseject);
/* * * * * * * * * * *
*承诺功能*
* * * * * * * * * * */
//没有回报任何承诺
//(立即决定)
函数updateStatusLoading(){
如果(!$scope.status.loading){
$scope.status.loading=“”;
}
$scope.status.loading+=”;
}
//返回承诺以外的内容(字符串…)
//(立即决定)
函数计数(){
$scope.status.counter++;
返回“进行了一些计数…”(“+$scope.status.counter+”);
}
//使用$timeout返回的承诺
//(延迟决议)
函数activateEmail(){
返回$timeout(函数simulateActivateEmailLatency(){
$scope.status.emailActivated=true;
}, 1000);
}
//使用$q.defer返回的承诺,在$timeout中解决
//(立即返回,但解决延迟)
函数signinByToken(){
var deferred=$q.deferred();
$timeout(函数simulateSignInLatency(){
$scope.status.signinByToken=true;
推迟,解决({
returningSomething:“完全是可选的”
});
}, 1000);
//登录控制台以了解此对象的外观
$log.log(“deferred.promise:”,deferred.promise);
回报。承诺;
}
//使用$q.when创建的承诺;无超时
//(立即解决)
函数setPersonalInfo(){
$scope.status.personalInfo=true;
$log.log(“$q.when:”,$q.when({
傅:“酒吧”
}));
返回$q.when({
returningSomething:“完全是可选的”
});
}
//使用$state.go创建的承诺
//(路由更改后将进行解析;这可能包括执行ui路由器解析所花费的时间…)
函数goToDashboard(){
//是的,这是一个承诺!
// https://github.com/angular-u
var goToDashboard = function () {
    //TODO: use $q here?
    $state.go('dashboard');
};