【问题标题】:Is it possible to queue in succesion an array of functions that return promises?是否可以连续排队返回承诺的函数数组?
【发布时间】:2021-02-24 00:44:00
【问题描述】:

举个例子:

function exec()
{
    var dfd = $.Deferred();

    asyncStuff().then(
    function(res)
    {
        if(res)
        {
            dfd.resolve(true);
        }
        else
        {
            dfd.resolve(false);
        }
    });

 return dfd.promise();
}

var promise_arr = [];
promise_arr.push( exec() );
promise_arr.push( exec() );
promise_arr.push( exec() );
promise_arr.push( exec() );

Promise.all( promise_arr ).then(
function(res)
{
    console.log("finished!");
});

所以数组中的函数几乎是同时执行的。这是不好的。只有在另一个按顺序完成后才能调用一个。 有没有办法让他们排队?

编辑:

为了让它工作,我必须在 for 循环中调用一个匿名函数,并且我冒险停止它的执行,无论我的承诺是否返回正确的答案。 该匿名函数用作承诺工厂,请查看:https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html

另外,当我推送函数时,我必须移除大括号,以便它们在将​​它们推送到数组中时停止执行。

function Exec()
{
    var dfd = $.Deferred();
    
    setTimeout(
    function()
    { 
        console.log("executing OK"); 
        var res_obj = {};
        res_obj.res_value = true;
        dfd.resolve(res_obj);
    }, 1000);
    
    return dfd.promise();
}

function ExecNO()
{
    var dfd = $.Deferred();
    
    setTimeout(
    function()
    { 
        console.log("Executing ERROR"); 
        var res_obj = {};
        res_obj.res_value = false;
        res_obj.res_error = "Ima error func";
        dfd.resolve(res_obj);
    }, 1000);
    
    return dfd.promise();
}

function ExecSincroProcess( promise_arr )
{
    var res_obj = {};
    res_obj.res_value = true;

    var result = Promise.resolve(res_obj);

    promise_arr.forEach(
        function (promiseFunction) 
        {
            result = 
            result.then(
            function(res)
            {
                if (res.res_value)
                {
                    return promiseFunction();
                }
                else
                {
                    return res;
                }
            });
        });

        result.then(
    function(res)
    {
        console.log(res.res_error);
        console.log("finished!");
    });
}

function ExecAll()
{
    var pr_Arr = [];
    pr_Arr.push(Exec);
    pr_Arr.push(Exec);
    pr_Arr.push(ExecNO);
    pr_Arr.push(Exec);
    pr_Arr.push(Exec);
    
    ExecSincroProcess(pr_Arr);
}

【问题讨论】:

    标签: javascript jquery queue jquery-deferred


    【解决方案1】:

    有一种方法可以将 Promise 排队。我过去排队 promise 的方式是循环遍历数组并将它们与.then 子句一起链接:

    例如

    let promiseChain = Promise.resolve()
    promiseFunctionArray.forEach(promiseFunction => {
        promiseChain = promiseChain.then(promiseFunction)
    })
    
    promiseChain.then(() => {/* do what you want to with the results */})
    

    所以你的情况可能是这样的:

    function exec()
    {
        var dfd = $.Deferred();
    
        asyncStuff().then(
        function(res)
        {
            if(res)
            {
                dfd.resolve(true);
            }
            else
            {
                dfd.resolve(false);
            }
        });
    
     return dfd.promise();
    }
    
    var promise_arr = [];
    promise_arr.push(exec);
    promise_arr.push(exec);
    promise_arr.push(exec);
    promise_arr.push(exec);
    
    var promiseChain = Promise.resolve()
    promise_arr.forEach(promiseFunction => {
        promiseChain = promiseChain.then(promiseFunction)
    })
    
    promiseChain.then(
    function(res)
    {
        console.log("finished!");
    });
    

    【讨论】:

    • 谢谢!一定会试试看的!
    • 这个答案大部分是正确的,但我不得不稍微调整一下才能让它工作!
    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2018-02-14
    • 2019-07-09
    • 1970-01-01
    • 2015-10-15
    • 2017-04-05
    • 2017-05-30
    相关资源
    最近更新 更多