首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不能在已解决的承诺上使用then?

为什么我不能在已解决的承诺上使用then?
EN

Stack Overflow用户
提问于 2019-06-25 22:58:36
回答 1查看 79关注 0票数 0

我有一个函数,它的任务是遍历许多文件(这些文件使用数组中的值作为文件名的构建块),并使用reduce下载它们。到目前为止,这更像是一种黑客行为,但Promise逻辑应该可以工作。除了它没有。t

下面是我的代码:

代码语言:javascript
复制
function import_demo_files(data) {
    /**
     * Make a local copy of the passed data.
     */
    let request_data = $.extend({}, data);

    const get_number_of_files_1 = Promise.resolve({
        'data' : {
            'number_of_files' : 2
        }
    });

    return new Promise((resolve, reject) => {
        let import_files = get_number_of_files_1.then(function(response) {
            new Array(response.data.number_of_files).fill(request_data.step_name).reduce((previous_promise, next_step_identifier) => {
                let file_counter = 1;

                return previous_promise.then((response) => {
                    if( response !== undefined ) {
                        if('finished_import' in response.data && response.data.finished_import === true || response.success === false) {
                            return import_files;
                        }
                    }
                    const recursively_install_step_file = () => import_demo_file({
                        demo_handle: request_data.demo_handle,
                        'step_name': request_data.step_name,
                        'file_counter': file_counter

                    }).call().then(function(response) {
                        file_counter++;

                        if('file_counter' in response.data && 'needs_resume' in response.data) {
                            if(response.data.needs_resume === true) {
                                file_counter = response.data.file_counter;
                            }
                        }
                        return response.data.keep_importing_more_files === true ? recursively_install_step_file() : response
                    });
                    return recursively_install_step_file();
                }).catch(function(error) {
                    reject(error);
                });
            }, Promise.resolve())
        }).catch(function(error) {
            reject(error);
        });
        resolve(import_files);
    });
}

现在,当我这样做的时候:

代码语言:javascript
复制
const import_call = import_demo_files({ 'demo_handle' : 'demo-2', 'step_name' : 'post' });
console.log(import_call);

console.log告诉我,import_call实际上是一个promise ,它是解析的。我非常喜欢return允许我摆脱承诺链的方式,但我不知道如何正确地解析其中的承诺链,所以很明显,它被标记为已解决。

我想做import_call.then(...,但到目前为止还不起作用,因为import_demo_files中的不正确处理,它在实际完成之前在这里执行了这段代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 08:40:09

reduction中的异步递归并不是最容易处理的事情,而且也不是很明显,为什么要给出递归的每个迭代都与其他迭代相同的原因。

删除以下外部成员后,reduce/recurse模式更易于理解:

代码语言:javascript
复制
1. the `recursively_install_step_file()` function
1. the `new Array(...).fill(...)`, as `starterArray`
1. the object passed repeatedly to `import_demo_file()`, as `importOptions`)

这种方法消除了对变量file_counter的需要,因为importOptions.file_counter可以直接更新。

代码语言:javascript
复制
function import_demo_files(data) {
    // outer members
    let request_data = $.extend({}, data);
    const importOptions = {
        'demo_handle': request_data.demo_handle,
        'step_name': request_data.step_name,
        'file_counter': 1
    };
    const starterArray = new Array(2).fill(request_data.step_name);
    function recursively_install_step_file() {
        return import_demo_file(importOptions).then((res) => {
            if('file_counter' in res.data && 'needs_resume' in res.data && res.data.needs_resume) {
                importOptions.file_counter = res.data.file_counter; // should = be += ?
            } else {
                importOptions.file_counter++;
            }
            return res.data.keep_importing_more_files ? recursively_install_step_file() : res;
        });
    }

    // the reduce/recurse pattern
    return starterArray.reduce((previous_promise, next_step_identifier) => { // next_step_identifier is not used?
        let importOptions.file_counter = 1; // reset to 1 at each stage of the reduction?
        return previous_promise.then(response => {
            if(response && ('finished_import' in response.data && response.data.finished_import || !response.success)) {
                return response;
            } else {
                return recursively_install_step_file(); // execution will drop through to here on first iteration of the reduction
            }
        });
    }, Promise.resolve());
}

可能不是100%正确,但总体模式应该是正确的。准备好在它上面工作一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56756911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档