如何从Promise返回数据

IT技术 javascript angularjs
2021-01-27 00:18:51

我需要response.data摆脱Promise,以便它可以由封闭函数返回。我知道,由于正常的 JavaScript 范围,我可能无法按照我编码的方式来完成。有什么办法,可以做到吗?

#1 处console.log生成正确的数据。console.log #2 总是产生 'a';

function addSiteParentId(nodeId) {   
    var theParentId = 'a';
    var parentId = relationsManagerResource.GetParentId(nodeId)
                        .then(function(response){                               
                            theParentId = response.data;
                            console.log(theParentId);  // #1
                        });
    console.log(theParentId);  // #2
    return theParentId;
}

任何指针将不胜感激。

3个回答

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

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

这是来自 HTML5Rocks 的资源,它涵盖了Promise的生命周期,以及如何异步解析其输出:https :
//web.dev/promises/

非常感谢您的温柔指导。我知道这与我处理它的方式有关。我对 Angular 很陌生,所以遇到了砖墙。它现在正在工作,但一旦恐慌结束,它可能会进一步完善。再次感谢你提供的建议。
2021-03-28 00:18:51
@donothingsuccessfully 据我所知,我确实按要求回答了这个问题。
2021-04-01 00:18:51
@Maximillian 道歉
2021-04-11 00:18:51
@Maximillian 我建议回答所问的问题也有value。
2021-04-13 00:18:51

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

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

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

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在访问 property 之前始终解析该方法theParentId我们可以通过使用一些方法来实现这一点。

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

    resolve: {
        parentId: function (your_factory) {
             your_factory.addSiteParentId();
        }
    }
    

然后在路由器中使用的控制器和其他服务中,只需调用 your_factory.theParentId 即可获取您的财产。请参阅此处了解更多信息:http ://odetocode.com/blogs/scott/archive/2014/05/20/using-resolve-in-angularjs-routes.aspx

  • 使用run应用程序的方法来解决您的服务。

    app.run(function (your_factory) { your_factory.addSiteParentId(); })
    
  • 将其注入到第一个控制器或控制器的服务中。在控制器中,我们可以调用所有需要的初始化服务。然后所有作为主控制器子级的控制器都可以根据需要正常访问此属性。

选择你的方式取决于你的上下文取决于你的变量的范围和你的变量的读取频率。

你必须返回一个Promise而不是一个变量。所以在你的函数中只需返回:

return relationsManagerResource.GetParentId(nodeId)

然后解决返回的Promise。或者您可以推迟另一个并解决theParentId它。