Javascript Angularjs:尝试在我的应用程序启动时进行asyn调用不会返回承诺
在我的应用程序中,我试图在应用程序启动时加载angular JS常量,方法是通过进行异步调用从json文件读取数据,一旦代码命中异步调用,它就会执行其他位,然后返回到.then代码块 在angular JS中是否等待停止执行直到完成异步调用 例如:Javascript Angularjs:尝试在我的应用程序启动时进行asyn调用不会返回承诺,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,在我的应用程序中,我试图在应用程序启动时加载angular JS常量,方法是通过进行异步调用从json文件读取数据,一旦代码命中异步调用,它就会执行其他位,然后返回到.then代码块 在angular JS中是否等待停止执行直到完成异步调用 例如: define(['app'], function (app) { 'use strict'; app.config(function ($provide) { var serviceUrl=null;
define(['app'], function (app) {
'use strict';
app.config(function ($provide) {
var serviceUrl=null;
var initInjector = angular.injector(['ng']);
var $http = initInjector.get('$http');
var responsePromise = $http.get('/scripts/config.json');
responsePromise .then(function (response) {
serviceUrl = response.data;
$provide.value('serviceURL', serviceUrl);
},function (response) {
throw new Error('Something went wrong...');
});
});
return app;
});
建议您为此使用app.run方法:
app.run(['$http, $provide', function($http, $provide){
// your code
}]);
据我所知,您无法使$http方法同步运行。它们都返回一个承诺,该承诺解析为异步。但您可以在代码中等待,直到promise解决如下问题:
var lock=false;
$http.post(...).then(function (results) {
// your code
lock=true;
});
while (!lock) {
// We're just waiting.
}
// code that should be executed after you get something with your request
第二种选择是使用jQuery.ajax{async:false}同步运行请求我建议您使用RequireJS来实现这一点。虽然这是关于控制器的,但我们已经习惯于加载服务和其他脚本。问题是,在执行$http调用后,应用程序将立即继续执行,这正是OP想要阻止的。您注意到了吗!锁{}块?谢谢,但选项一不适用于我,因为我得到错误未知提供程序:$http,$provideProvider我的代码中没有while块。上面的示例代码位于angularjs requirejs项目应用程序目录中的config.js文件中。此config.js文件在应用程序启动时与routes.js文件一起加载。$provide是您要求angular注入的依赖项。从代码中复制。如果需要,请使用$http.get而不是$http.post。