Javascript 用承诺说话
我想我需要(但我不确定)在我的Angularjs应用程序中使用承诺。下面的代码在我的控制器中,它调用了一个名为Javascript 用承诺说话,javascript,angularjs,Javascript,Angularjs,我想我需要(但我不确定)在我的Angularjs应用程序中使用承诺。下面的代码在我的控制器中,它调用了一个名为.service(不是.factory,如果相关的话?)的processString //complete this first var item = MagicBoxService.processString(str); //and then do this $scope.task.items.push({ content_type: item.content_type
.service
(不是.factory
,如果相关的话?)的processString
//complete this first
var item = MagicBoxService.processString(str);
//and then do this
$scope.task.items.push({ content_type: item.content_type, provider: item.provider, front: item.front, data: item.data });
$scope.save = true;
该服务需要与第三方API(以及我自己的API)通信以获取数据。这种情况发生得很快,但是执行代码的下一部分时,项
变量为空
我在API调用上尝试了$timeout
,但这似乎不起作用,因此我认为可能需要使用承诺,因此我尝试了以下方法:
var item = MagicBoxService.processString(str).then(function() {
$scope.task.items.push({ content_type: item.content_type, provider: item.provider, front: item.front, data: item.data });
$scope.save = true;
})
但是这给了我未定义的不是一个函数。如有任何建议/代码,将不胜感激
编辑
这是我的.service
的编辑版本
this.processString = function(str) {
...
oEmbedService.query({url: str}, function(response) {
item.content_type = "image";
item.provider = "Flickr";
item.data = response.content.url;
item.front = $sce.trustAsResourceUrl(item.data);
})
...
return item
};
如果您的
processString()
函数如下所示:
function(str) {
var promiseManager = $q.defer();
...
oEmbedService.query({url: str}, function(response) {
var item = {};
item.content_type = "image";
item.provider = "Flickr";
item.data = response.content.url;
item.front = $sce.trustAsResourceUrl(item.data);
promiseManager.resolve(item);
})
...
return promiseManager.promise;
};
MagicBoxService.processString(str).then(function(item) {
$scope.task.items.push({ content_type: item.content_type, provider: item.provider, front: item.front, data: item.data });
$scope.save = true;
})
然后你可以这样称呼它:
function(str) {
var promiseManager = $q.defer();
...
oEmbedService.query({url: str}, function(response) {
var item = {};
item.content_type = "image";
item.provider = "Flickr";
item.data = response.content.url;
item.front = $sce.trustAsResourceUrl(item.data);
promiseManager.resolve(item);
})
...
return promiseManager.promise;
};
MagicBoxService.processString(str).then(function(item) {
$scope.task.items.push({ content_type: item.content_type, provider: item.provider, front: item.front, data: item.data });
$scope.save = true;
})
如果您的
processString()
函数如下所示:
function(str) {
var promiseManager = $q.defer();
...
oEmbedService.query({url: str}, function(response) {
var item = {};
item.content_type = "image";
item.provider = "Flickr";
item.data = response.content.url;
item.front = $sce.trustAsResourceUrl(item.data);
promiseManager.resolve(item);
})
...
return promiseManager.promise;
};
MagicBoxService.processString(str).then(function(item) {
$scope.task.items.push({ content_type: item.content_type, provider: item.provider, front: item.front, data: item.data });
$scope.save = true;
})
然后你可以这样称呼它:
function(str) {
var promiseManager = $q.defer();
...
oEmbedService.query({url: str}, function(response) {
var item = {};
item.content_type = "image";
item.provider = "Flickr";
item.data = response.content.url;
item.front = $sce.trustAsResourceUrl(item.data);
promiseManager.resolve(item);
})
...
return promiseManager.promise;
};
MagicBoxService.processString(str).then(function(item) {
$scope.task.items.push({ content_type: item.content_type, provider: item.provider, front: item.front, data: item.data });
$scope.save = true;
})
你的MagicBoxService应该为这种方法返回一个承诺OK,这可能超出我的理解范围。让我在问题中发布一个我的服务的精简版本,看看它如何被修改。您的MagicBoxService服务应该为这种方法返回一个承诺OK,这可能超出我的理解范围。让我在问题中发布我的服务的精简版本,看看如何修改我刚刚在问题中添加了我的
processString
-你能编辑你的回答吗?事实上-我只是错过了控制器中的项目-工作正常。但是,(问题中没有明确这一点)processString中还有其他不需要承诺的操作,那么如何在控制器端处理这些操作呢?顺便说一下,谢谢!当我用一个不需要调用API的字符串调用服务时,我发现undefined不是一个函数
(因此不包含在承诺中)。我刚刚将我的processString
添加到问题中-你能编辑你的回答吗?实际上-我只是错过了控制器中的项目-工作正常。但是,(这在问题中并不清楚)processString中还有其他不需要承诺的操作,那么我如何在控制器端处理这些操作呢?顺便说一句,谢谢!当我使用不需要调用API的字符串调用服务时,我发现undefined不是一个函数(因此不包含在承诺中)。