Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用承诺说话_Javascript_Angularjs - Fatal编程技术网

Javascript 用承诺说话

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

我想我需要(但我不确定)在我的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, 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不是一个函数(因此不包含在承诺中)。