Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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 如何从promise返回数据_Javascript_Angularjs - Fatal编程技术网

Javascript 如何从promise返回数据

Javascript 如何从promise返回数据,javascript,angularjs,Javascript,Angularjs,我需要从promise中获取响应.data,这样它就可以由封闭函数返回。我知道,由于JavaScript的作用域是正常的,所以我可能无法用我编写代码的方式来完成它。有什么办法可以做到吗 位于#1的console.log生成正确的数据。console.log#2始终生成“a” 函数addSiteParentId(nodeId){ var theParentId='a'; var parentId=relationsManager.GetParentId(nodeId) .then(函数(响应){

我需要从promise中获取
响应.data
,这样它就可以由封闭函数返回。我知道,由于JavaScript的作用域是正常的,所以我可能无法用我编写代码的方式来完成它。有什么办法可以做到吗

位于#1的console.log生成正确的数据。console.log#2始终生成“a”

函数addSiteParentId(nodeId){ var theParentId='a'; var parentId=relationsManager.GetParentId(nodeId) .then(函数(响应){ theParentId=response.data; console.log(theParentId);/#1 }); console.log(theParentId);/#2 归还护照; }
任何指针都会受到欢迎。

承诺背后的基本原则之一是异步处理。这意味着您不能创建承诺,然后立即在代码中同步使用其结果(例如,不可能从启动承诺的函数中返回承诺的结果)

您可能想做的是返回整个承诺本身。然后,任何需要其结果的函数都可以调用
。然后()
在承诺上,当承诺得到解决时,结果就会出现

下面是一个来自HTML5Rocks的资源,它跨越了promise的生命周期,以及它的输出是如何异步解析的:

您必须返回一个承诺,而不是一个变量。 因此,在函数中,只需返回:

return relationsManagerResource.GetParentId(nodeId)
然后解决返回的承诺。
或者,您可以进行另一个延迟,并用它解析parentid。

我也不喜欢使用函数来处理在每个控制器和服务中已被一次又一次解析的属性。似乎我并不孤单:D

不要试图以承诺作为变量来获得结果,当然不可能。但我发现并使用下面的解决方案作为属性访问结果

首先,将结果写入服务的属性:

app.factory('your_factory',function(){
    var theParentIdResult = null;
    var factoryReturn = {  
        theParentId: theParentIdResult,
        addSiteParentId : addSiteParentId
    };
    return factoryReturn;
    function addSiteParentId(nodeId) {   
         var theParentId = 'a';
         var parentId = relationsManagerResource.GetParentId(nodeId)
             .then(function(response){                               
                 factoryReturn.theParentIdResult = response.data;
                 console.log(theParentId);  // #1
             });                    
    }        
})
现在,我们只需要确保方法
addSiteParentId
总是在访问属性
theParentId
之前解析。我们可以通过一些方法来实现这一点

  • 在路由器中使用解析方法:

    resolve: {
        parentId: function (your_factory) {
             your_factory.addSiteParentId();
        }
    }
    
然后,在路由器中使用的控制器和其他服务中,只需致电您的工厂即可获得您的财产。 有关更多信息,请参阅此处:

  • 使用应用程序的
    run
    方法解析您的服务

    app.run(function (your_factory) { your_factory.addSiteParentId(); })
    
  • 将其注入控制器的第一个控制器或服务中。在控制器中,我们可以调用所有必需的init服务。然后,作为主控制器的子控制器的所有剩余控制器都可以按照您的需要正常访问此属性


选择方法取决于上下文,取决于变量的范围和变量的阅读频率

否-您不能-您想对
响应执行的任何操作都必须进入
.then()
处理程序。不能以同步样式编写异步Javascript!这与从承诺中返回数据无关。第二个
console.log
发生在promise设置
parentid
变量之前-因为promise是异步的,而
console.log
不是。@Amit,是的,我做了,但只有关于问题不够具体的抱怨,这是真的。非常感谢您的温和指导。我知道这与我处理此事的方式有关。我是个新手,所以我撞到了砖墙。它现在正在发挥作用,但在恐慌结束后可能会进一步完善。再次感谢您的建议。@Maximillian我建议按要求回答问题也有价值。@Don’就我所知,我没有成功地回答问题。@Maximillian表示歉意