我可以 return 来自 .then() 回调的承诺吗?
May I return a promise from a .then() callback?
我有一个场景,我需要创建一个任务(如果它不存在),在两种情况下都返回任务。
下面的代码正确吗?
CreateTaskIfNotExists(taskName: string): ng.IPromise<Task> {
return this.GetTask(taskName)
.then( t => {
if (t) return t;
else return this.CreateTask(taskName);
});
}
CreateTask(taskName: string): ng.IPromise<Task> {
// use $http to call Rest Web Service to create the task
// and return promise
}
GetTask(taskName: string): ng.IPromise<Task> {
// use $http to call Rest Web Service to getthe task
// and return promise
}
以上代码在我从控制器调用的服务中:
TaskService.CreateTaskIfNotExists(taskName)
.then( task => {
$scope.Task = task;
});
有用吗?
编辑:
看看这段代码:
.then( t => {
if (t) return t;
else return CreateTask(taskName);
});
then
总是returns一个承诺,回调中返回的对象的承诺。如果 t
是 returns t
,那么 .then
returns ng.IPromise<Task>
对吗?但是,如果 t
不是什么东西,那么 returns CreateTask(taskName)
又 returns 类型为 ng.IPromise<Task>
的承诺,那么 returns then
? ng.IPromise<ng.IPromise<Task>>
?或 then
展开并 returns ng.IPromise<Task>
?
是的,您绝对可以 return .then
中的承诺 - 这就是您执行连续异步操作的方式。
如果你 return 在 .then
中做出承诺,那么当这个承诺被履行时,结果将被提供给下一个链接 .then
。
如果您 return 一个(非承诺)值,那么这是将被赋予下一个链接的值 .then
。
最主要的是不要有一个 API,有时 return 是一个承诺,有时 return 是一个值 - 但这不是你所拥有的,所以你很好。
这是一个与你的相似的 illustrative example (plunker)。
我有一个场景,我需要创建一个任务(如果它不存在),在两种情况下都返回任务。
下面的代码正确吗?
CreateTaskIfNotExists(taskName: string): ng.IPromise<Task> {
return this.GetTask(taskName)
.then( t => {
if (t) return t;
else return this.CreateTask(taskName);
});
}
CreateTask(taskName: string): ng.IPromise<Task> {
// use $http to call Rest Web Service to create the task
// and return promise
}
GetTask(taskName: string): ng.IPromise<Task> {
// use $http to call Rest Web Service to getthe task
// and return promise
}
以上代码在我从控制器调用的服务中:
TaskService.CreateTaskIfNotExists(taskName)
.then( task => {
$scope.Task = task;
});
有用吗?
编辑:
看看这段代码:
.then( t => {
if (t) return t;
else return CreateTask(taskName);
});
then
总是returns一个承诺,回调中返回的对象的承诺。如果 t
是 returns t
,那么 .then
returns ng.IPromise<Task>
对吗?但是,如果 t
不是什么东西,那么 returns CreateTask(taskName)
又 returns 类型为 ng.IPromise<Task>
的承诺,那么 returns then
? ng.IPromise<ng.IPromise<Task>>
?或 then
展开并 returns ng.IPromise<Task>
?
是的,您绝对可以 return .then
中的承诺 - 这就是您执行连续异步操作的方式。
如果你 return 在 .then
中做出承诺,那么当这个承诺被履行时,结果将被提供给下一个链接 .then
。
如果您 return 一个(非承诺)值,那么这是将被赋予下一个链接的值 .then
。
最主要的是不要有一个 API,有时 return 是一个承诺,有时 return 是一个值 - 但这不是你所拥有的,所以你很好。
这是一个与你的相似的 illustrative example (plunker)。