gpt4 book ai didi

javascript - 使用 JavaScript 确保发布请求的顺序

转载 作者:可可西里 更新时间:2023-11-01 16:36:07 26 4
gpt4 key购买 nike

我在同时调用多个发布请求时遇到问题。我需要它们按顺序排列,但它们以随机顺序进入 API。如何在 JavaScript 中使用 http 方法确保顺序?

这是我正在做的一个例子:

for( var i = 0; i < result.length; i++ ) {
$scope.update(result[i]);
}

$scope.update = function(results) {
$http({
method: 'POST',
url: Config.serverUrl,
data: JSON.stringify(results),
headers: {'Content-Type': 'application/json'}
}).then(function (response) {
if ( response.data.status === "OK") {
$scope.error = null;
$scope.success = "Banco atualizado!";
} else {
$scope.error = response.data.message;
$scope.success = null;
}
$scope.searchTimeout();
}, function (response) {
$scope.error = "Banco atualizado! (erro baddata)";
$scope.success = null;
});
};

更新

按照@TJCrowder 的建议使用两个for 循环并使用promise 的示例:

$scope.myFunc = function(results) {
return new Promise(function(resolve) {
resolve($scope.update(results));
});
};

var p = Promise.resolve();
for( var j = 0; j < result[3].length; j++ ){
for( var i = 0; i < result[4].length; i++ ){
p = p.then($scope.myFunc.bind($scope, results));
}
}

最佳答案

return 添加到您的 update 以便返回 promise ,然后将循环转换为 reduce 调用:

results.reduce(function(p, entry) {
return p.then(function() { return $scope.update(entry); });
}, Promise.resolve());

这通过创建一个 promise 链来执行系列调用,等待前一个完成后再开始下一个。

或者,如果您使用的是非数组列表或类似的列表,您可以只使用 for 循环来完成此操作:

var p = Promise.resolve();
for (var i = 0; i < results.length; ++i) {
p = p.then($scope.update.bind($scope, results[i]));
}

我们在那里需要 bind(或类似的东西),否则我们会遇到 closures in loops问题。如果您可以依赖 ES2015+ 功能,则可以改用 let,这将使每个闭包关闭其自己的 i:

let p = Promise.resolve();
for (let i = 0; i < results.length; ++i) {
// ^^^-- Important, `let` and `var` are quite different here
p = p.then(() => $scope.update(results[i]));
}

my answer to this other question 中有更多关于串行处理与并行处理 promise 集合的详细信息。 ,但我认为说这是该问题的重复有点牵强。

关于javascript - 使用 JavaScript 确保发布请求的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769227/

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