gpt4 book ai didi

javascript - Promise 未在 .each() 循环中解决

转载 作者:行者123 更新时间:2023-12-02 14:19:34 25 4
gpt4 key购买 nike

我必须运行一个递归过程,但 promise 没有按我想要的方式工作。这是代码:

var openAllLeves = function () {
openAll = 1;
$.when(openLevels()).then(openAll = 0);
}

var openLevels = function () {
var promises = [];
$('.myClass:not([data-type="T"])').each(function () {
var defer = $.Deferred();
$.when(loadLine($(this)).then(promises.push(defer)));
});
return $.when.apply(undefined, promises).promise();
}

var loadLine = function (thisObj) {
var defer = $.Deferred();
switch(nivel) {
case 1:
$.when(getPT($(thisObj).attr('data-a'))).then(defer.resolve());
break;
case 2:
// ...
}
return defer.promise();
}

var getPT = function (psn) {
var defer = $.Deferred();
var payload = { /* parameters... */ };
$.ajax({
url: webmethod,
data: payload,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
timeout: 10000,
success: function (data) {
$.when(paintPT(data)).then(function () {
if (openAll)
openLevels(), defer.resolve();
});
}
});
return defer.promise();
}

我的问题是 openAll 的值在 ajax 函数成功代码中计算之前更改为 0,因此只执行了一次迭代并且没有完成递归。看起来 .then 是在解析 Promise 数组之前执行的。

代码有点令人困惑,因此感谢您的帮助。提前致谢。

最佳答案

避免 deferred antipattern !

另外,当你传递一些东西给 .then() 时,它必须是回调函数,调用 promises.push(defer), defer.resolve( )openAll = 0 等不起作用,它会立即执行该表达式,而不是等待 promise 。

$.when().promise() 调用大多是多余的。放下它们。

function openAllLeves () {
openAll = 1;
openLevels().then(function() {
openAll = 0
});
}

function openLevels() {
var promises = [];
$('.myClass:not([data-type="T"])').each(function () { // using `map` would be even better
promises.push(loadLine($(this)));
});
return $.when.apply($, promises);
}

function loadLine(thisObj) {;
switch(nivel) {
case 1:
return getPT($(thisObj).attr('data-a'))
case 2:
// ...
}
}

function getPT(psn) {
var payload = { /* parameters... */ };
return $.ajax({
url: webmethod,
data: payload,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
timeout: 10000,
}).then(function (data) {
return paintPT(data);
}).then(function () {
if (openAll)
openLevels();
});
}

顺便说一句,您可能希望将 if (openAll) openLevels(); 链接到 openLevels() 的返回值,而不是链接到每个单个请求 promise 。

关于javascript - Promise 未在 .each() 循环中解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38764688/

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