为什么我的Promise减速器模式会弄乱订单?

时间:2019-06-23 01:49:58

标签: javascript es6-promise

我已经使用Promises模式使用reduce()实现了对系统这一小部分后端的调用,例如:

首先,一个使用promise处理AJAX调用的助手对象:

class Base_Ajax_Requester extends Promise_Helped_AJAX_Call {
    ajax_success(response) {
        console.log(response);
    }

    ajax_error(response) {
        console.log(response);
    }
}

它具有call函数,该函数基本上返回带有AJAX调用返回内容的promise。然后,我可以使用Base_Ajax_Requester.call().then()来完成该呼叫的结束时间。

我当前的系统形式是,首先下载一个模式文件,然后下载一些导入文件:

let fake_data = {
    'demo_handle' : 'demo-2',
    'steps_to_import' : [ 'post', 'elementor-hf' ]
}

function install_items_original() {
    let demo_schema_download = new Base_Ajax_Requester(
        localized_data.ajax_url,
        {
            //data
        }
    );

    let import_files_download = demo_schema_download.call().then(fake_data.steps_to_import.reduce(function(previous_promise, next_step_identifier) {
        return previous_promise.then(function() {
            let download_import_files_promise = new Base_Ajax_Requester(
                localized_data.ajax_url,
                {
                    //data
                }
            );
            return download_import_files_promise.call();
        });
    }, Promise.resolve())).catch( function(error) {
        console.log(error);
    });

    return import_files_download;
}

但是它不起作用。有时会感到困惑,它首先调用download_import_files_promise而不是demo_schema_download。或更糟糕的是,它没有等待第一个承诺demo_schema_download 完成。

但是,如果我实际上做同样的事情,但是是硬编码的:

function install_demo_hardcoded() {
    let demo_schema_download = new Base_Ajax_Requester(
        localized_data.ajax_url,
        {
            //data
        }
    );

    let import_files_download = demo_schema_download.call().then(function() {
        let download_import_files_promise_1 = new Base_Ajax_Requester(
            localized_data.ajax_url,
            {
                //data
            }
        );
        download_import_files_promise_1.call().then(function() {
            let download_import_files_promise_2 = new Base_Ajax_Requester(
                localized_data.ajax_url,
                {
                    //data
                }
            );
            download_import_files_promise_2.call();
        });
    });

    return import_files_download;
}

我到底想念什么?我在demo_schema_download.call().then(..)的第一个Promise处发现了错误的错误处理,在此情况下,我应该处理它实际上失败的情况,而不要调用下一个2。另一方面,我已经检查了它失败的情况,并且它没有不要继续。另外,这也可以:

function install_demo_original() {
    let demo_schema_download = new Base_Ajax_Requester(
        localized_data.ajax_url,
        {
        }
    );

    let import_files_download = demo_schema_download.call().then(function() {
        let download_import_files_promise = new Base_Ajax_Requester(
            localized_data.ajax_url,
            {
            }
        );
        download_import_files_promise.call().then( function() {
            let download_import_files_promise = new Base_Ajax_Requester(
                localized_data.ajax_url,
                {
            });
            download_import_files_promise.call();
        });
    });

    return import_files_download;
}

1 个答案:

答案 0 :(得分:0)

找到了罪魁祸首!

当我在初次致电.then时呼叫demo_schema_download.call()时,我直接将reduce传递给它:fake_data.steps_to_import.reduce(...当我应该传递一个function中包含以下内容:

let import_files_download = demo_schema_download.call().then(function() {
        fake_data.steps_to_import.reduce(function(previous_promise, next_step_identifier) {...

使最终代码如下:

let import_files_download = demo_schema_download.call().then(function() {
    fake_data.steps_to_import.reduce(function(previous_promise, next_step_identifier) {
        return previous_promise.then(function() {
            let download_import_files_promise = new Base_Ajax_Requester(
                localized_data.ajax_url,
                {
                    //data
                }
            );
            return download_import_files_promise.call();
        });
    }, Promise.resolve())
}).catch(function(error) {
    console.log(error);
});

自然,这看起来像个怪物,但是,嘿,JavaScript,对吗?