比较来自世界各地的卖家的域名和 IT 服务价格

Angularjs $http 等待回复

我是新的b。 javascript/angularjs., 我想展示一个弹出窗口 bootstrap, 在某些元素上执行鼠标悬停时。

我为此创建了一个指令


/function/angular, app/ {
app.directive/'popOver',["$window","$http",function/$window,$http/{
return function/scope,elem,attrs/{
elem.on/'mouseover',function//{
console.log/'mouseover'/;
var data = scope.$apply/attrs.popOver/;
console.log/'in directive again'/;
console.log/data/;
}/;
};
}]/;
}//angular, app/;


指令的值是一个函数


<span class="asdf" pop-over="getVCard/id/">name</span>


功能 vcard /id/ 在我的控制器中定义 angularjs. 他检查是否存在数据 localstorage, 如果它们是,则返回数据。 否则它会履行请求 $http get 并保存数据 localstorage.


$scope.getVCard = function/id/{

var vcardKey = vcardKeyPrefix+id;

var vCardFromLS = localStorageService.get/vCardKey/;
if/vCardFromLS/{
return localStorageService.get/vCardKey/;
}

$http.get/app.common.vcardUrl/id//.
success/function/data/{
localStorageService.set/vCardKey,data/;
}/.
error/function/error/{
F1.common.error/data,function//{}/;
}/;

return localStorageService.get/vCardKey/;
};


只要 $http 回报 promise, 我得到了价值 undefined 在其指令中。 如何确保该功能
getVCard

同步返回?

我录制了谷歌后读了一些结果。 但建议的想法是使用回调。 但我不确定回调如何使其同步。 任何帮助将不胜感激。

UPDATE 1

/回应评论 Foo L/
我计划在几个地方使用相同的指令。 弹出窗口 vcards 和产品信息等等。 唯一会有不同的东西 - 这是指令的论点 pop-over. 因此,该指令将担心弹出窗口的显示。 在哪里获取数据将在一个单独的函数中传输到指令
已邀请:

江南孤鹜

赞同来自:

你不能强迫
$http.get//

同步。 只要
$http.get//

不可避免地

异步

, 您只能返回值的承诺,而不是值本身。

既然你需要在打电话时要这样做
$http.get//

, 您还必须使用不同的条件返回承诺 - 什么时候
vCardFromLS

成功退回 localstorage. 这可确保对象返回到任何呼叫
$scope.getVCard//

, 有一种方法
.then//

, 这是,这承诺,无论是被称为吗?
$http.get//

或不。

因此,代码应该是大约 :


$scope.getVCard = function/id/ {
var vcardKey = vcardKeyPrefix + id;
var vCardFromLS = localStorageService.get/vCardKey/;
var dfrd = $q.defer//;
if/vCardFromLS/ {
dfrd.resolve/localStorageService.get/vCardKey//;
}
else {
$http.get/app.common.vcardUrl/id//.success/function/data/ {
localStorageService.add/vCardKey, data/;//.add// rather than .set// ?
dfrd.resolve/data/;
}/.error/function/error/ {
F1.common.error/data, function// {
dfrd.reject/'$http.get/app.common.vcardUrl/id// failed'/;
}/;
}/;
}
return dfrd.promise;
};


现在你需要确保答案是
$scope.getVCard//

例如,加工,例如 :


$scope.getVCard/id/.then/function/data/ {
//success - do whatever is required with data
}, function/reason/ {
//failure - log and/or display `reason` as an error message
}/


EDIT

:

我的 "... 你也

应该

用不同的条件返回承诺 ... " - 这是夸大其词。

我不得不说:"... 你

你可以

, 为了使事情简单,用不同的条件返回承诺 ...".

另一个机会位于分支中,具体取决于承诺是否已返回或其他类型的对象/价值观。 但是,这是随机的,通常会导致代码的一些重复。

要回复问题请先登录注册