gpt4 book ai didi

javascript - AngularJS 双 HTTP 请求,这是一个好的解决方案还是我做错了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:36 25 4
gpt4 key购买 nike

结构

我有两个 Controller 和一个模型。

  1. 一个订单 Controller ,负责处理订单流程的一个步骤
  2. 仅处理订单导航的订单导航 Controller
  3. 处理订单所有数据的订单模型。

所有信息都存储在订单对象中,根据您选择的 bundle ,您会收到一个用于配置该 bundle 的选项卡。

在通过订单的不同步骤导航时,导航 Controller 始终在那里执行其工作,并且订单 Controller 可能会在您当前所在的特定配置步骤所需的不同 Controller 中发生变化。

场景

加载第一个状态时,订单 Controller 正在初始化,导航 Controller 正在初始化。两者都调用“OrderModel.getOrder()”方法,这是一个带有 http 调用的 promise 。

如果两个 Controller 都在初始化并且 promise 还没有解决,它会导致对 api 的双重请求,我认为这有点矫枉过正。

解决方案

我围绕 $q 库创建了一个包装器,它添加了一个新方法,unique。

独特的方法是将 promise 存储到模型中,如果 promise 不存在则创建一个新的 promise ,否则返回尚未解决的 promise 。这可以防止多个 http 调用。

问题

因为这个解决方案看起来如此简单明了,所以我觉得我做错了什么,你们如何看待这个结构/解决方案?

示例代码:

Controller getOrder 方法:

/**
* @name getOrders
* @param force
* @description
* Get the given order
*/
function getOrder (id, force) {
return $q(
function (resolve, reject) {
Orders.getOrder(id, force).then(
function (order) {
vm.order = order;
resolve(order);
},
reject
);
}
);
}

模型 getOrder 方法:

function getOrder (id, force) {
var url = AppConfig.ApiUrl + '/order/' + id;
var promiseUrl = url + '-force-' + force;

return $qPromise.unique(promiseUrl, function (resolve, reject) {
if (!force && model.orders[id]) {
return resolve(model.orders[id]);
}

$http.get(url, { bearer: true }).then(
function (response) {
model.orders[id] = response.data.data;
resolve(model.orders[id]);
},
reject
);
});
}

$q 包装器 (函数(){

angular.module('app').factory('$qPromise', qWrapper);

qWrapper.$inject = ['$q'];

/**
* @name QWrapper
* @param $q
* @returns {*}
* @description
* Wrapper arround $q to add the unique method.
*/
function qWrapper($q) {
var model = {
promises: {}
};

$q.unique = uniquePromise;

return $q;

/**
* @name uniquePromise
* @param id
* @param cb
* @description
* Promise wrapper for preventing multiple calls for the same data.
* @returns {*}
*/
function uniquePromise (id, cb) {
if (model.promises[id]) {
return model.promises[id];
}

var promise = model.promises[id] = $q(cb);
promise.catch(console.warn);

$q.when(
promise,
function () { delete model.promises[id]; },
function () { delete model.promises[id]; }
);

return promise;
}
}

})();

最佳答案

我曾经遇到过这样的情况,我必须同时进行两个 http 调用,因为两个 http 调用都会给我它们特定的 json。所以我不得不这样做,

var app=angular.module('myapp',[]);

app.controller('contactController',function($scope,$http,$q)
{

var promise1=$http.get("https://jsonplaceholder.typicode.com/posts/1");
var promise2=$http.get("https://jsonplaceholder.typicode.com/users/1");
$q.all([promise1, promise2]).then(function(data){
$scope.first=data[0];
$scope.second=data[1];
console.log("------FIRST HTTP RESPONSE_____");
console.log(JSON.stringify($scope.first));
console.log("------SECOND HTTP RESPONSE_____");

console.log(JSON.stringify($scope.second));
});
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>

<body ng-app="myapp" ng-controller="contactController">
</body>

这确实有效。 $scope.first 会给出第一次 http 调用的结果,$scope.second 给出第二次 http 调用的结果。

我不确定它是否能满足您的需要,但我只是分享了我所知道的。也许一些线索可以提供帮助。

关于javascript - AngularJS 双 HTTP 请求,这是一个好的解决方案还是我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41608780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com