Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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 AngularJS:返回一个由AngularJS中另一个承诺的结果构成的承诺?_Javascript_Angularjs_Promise_Angular Promise - Fatal编程技术网

Javascript AngularJS:返回一个由AngularJS中另一个承诺的结果构成的承诺?

Javascript AngularJS:返回一个由AngularJS中另一个承诺的结果构成的承诺?,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我在服务中定义了以下函数,其中我使用$http获取一些数据并设置对象的一些字段: function getComplexObject () { var complexObject = { 'A': null, 'B': null } $http.get('someURI').then(function(data) { complexObject.A = data; //Do some processing

我在服务中定义了以下函数,其中我使用
$http
获取一些数据并设置对象的一些字段:

function getComplexObject () {

    var complexObject = {
        'A': null,
        'B': null
    }
    $http.get('someURI').then(function(data) {
        complexObject.A = data;

        //Do some processing and set B 

        return complexObject;
    })
};
因此,到目前为止,我在
$http
服务中使用了promise,但我不知道如何使用
$q
包装函数,以便最终以以下方式使用它:

//Using my function as a promise
myService.getComplexObject().then(function (data) {
    this.complexObject = data;
})

我已经搜索了一些关于角度承诺的教程,但大多数都只是简单地解释了什么是承诺,或者做了一些与我已经做过的类似的事情,我猜测我想做的是可能的,但我找不到正确的语法或正确的教程。

只需将
return
放在
$http.get(…)前面。然后(…)
链,即

return $http.get(...).then(...);
这将确保
getComplexObject
的结果是一个承诺,它将(在解析时)包含
complexObject
的值

这正是
。然后
的设计目的-它接受
$http.get()
的承诺,并返回一个新的承诺,最终将使用自己的返回值而不是原始值来解析

FWIW,我将
complexObject
的声明放在
内。然后调用
调用-它不需要在外部范围内,它会无意中导致对该变量的闭包


注意:另外,在最后一次回调中使用
这个
时要小心——它可能不是你想象的那样

您可以稍后返回承诺并解决(请参阅:$q)


不,这绝对没有必要
.then()
已经为您完成了这项工作!这是一个承诺反模式。它实际上也破坏了正确的错误处理。请参阅<代码> .catch < /Calp>实例-如果<代码> $http.gt()(代码)>调用失败,此代码将完全无法通知调用方,因为在任何地方都不允许使用<代码>推迟.拒绝()/<代码>调用。结果是该代码是有害的。那么“//进行一些处理并设置B”呢?我想这是有原因的。当然,在出现错误的情况下,必须拒绝承诺。就承诺处理而言,“集合B”部分应该是无关的。此版本的问题是必须显式添加错误处理,而根据我的回答简单地添加
返回
,则允许错误自动通过承诺链传播,而无需额外的代码。谢谢,这是可行的,如果可能的话,我将把它标记为可接受的答案,关于这一点,你是正确的,我将使用$scope。
function getComplexObject () {

    var deferred = $q.defer();
    var complexObject = {
        'A': null,
        'B': null
    }
    $http.get('someURI').then(function(data) {
        complexObject.A = data;

        //Do some processing and set B 
        deferred.resolve(complexObject);
    });
    return deferred.promise;
};