嵌套承诺 Javascript

时间:2021-05-08 10:17:02

标签: javascript jquery promise

所以基本上我有一个程序可以在服务器端合并数据。 这是一种模拟(在这种情况下,返回始终为真),我正在循环遍历 javascript 1 中的 2 个数组对象,长度为 10,长度为 5,如图所示。

我的目标是,对于每个外部承诺,需要 5 个内部承诺才能移动到下一个外部承诺。

代码如下:

var OuterPromises = range(1, 10);
var InnerPromises = range(1, 5);

$('.--btn-start-promising').click(function() {
    var _outerPromise = Promise.resolve();
    var OuterPromisesCompleted = 0;
    OuterPromises.forEach(OuterPromise =>
    _outerPromise = _outerPromise.then(() => CallOuterPromise(OuterPromise)
        // .complete(result => {
        //     OuterPromisesCompleted++;
        //     $('.--outer-promise-completed').text(OuterPromisesCompleted);
        // })
        .catch(error => {})));
})

function CallOuterPromise(promise)
{
    var _innerPromise = Promise.resolve();
    return $.ajax({
        url: '/index.php/merger/outerpromise',
        success: function() {
            var InnerPromisesCompleted = 0;
            InnerPromises.forEach(InnerPromise =>
            _innerPromise = _innerPromise.then(() => CallInnerPromise(InnerPromise)
                // .complete(result => {
                //     InnerPromisesCompleted++;
                //     $('.--inner-promise-completed').text(InnerPromisesCompleted);
                // })
                .catch(error => {})))
        }
    })
}

function CallInnerPromise(promise)
{
    return $.ajax({
        url: '/index.php/merger/innerpromise',
        success: function() {

        }
    })
}

function range(min, max){
    const arr = Array(max - min + 1)
        .fill(0)
        .map((_, i) => i + min);
    return arr;
}

function SysOut(...args)
{
    $.each(args, function(i, a) {
        console.log(a);
})
}

Promises 工作,这里的问题是它发生的顺序不正确,而且一些内在的 Promises 没有发生。

执行顺序如下 Outer->Inner->Outer 对于前 9 个外部 promise,然后对于最后一个外部所有其他 5 个内部 promise。

我想要实现的顺序如下:

  • 外 1
    • 内部 1
    • 内部 2
    • 内部 3
    • 内四
    • 内 5
  • 外层 2

.. 等等 基本上所有的请求都是 1 × 1 的,当一个外部完成时,内部开始 1 × 1,而不是在准备好时处理下一个外部,依此类推。

我做错了什么?

另外一个注意事项。 您可能会注意到有一个完整的评论。使用时它表示未定义。知道它已完成并更新我的 UI 的方法是什么?

问候。

0 个答案:

没有答案