gpt4 book ai didi

javascript - 为什么我不能在已解决的 promise 上使用 then ?

转载 作者:行者123 更新时间:2023-12-02 23:25:21 27 4
gpt4 key购买 nike

我的函数的工作是检查多个文件(使用数组中的值作为文件名的构建 block )并使用 reduce 下载它们。 。到目前为止,这更像是一种黑客攻击,但 Promise逻辑应该有效。但事实并非如此。

这是我的代码:

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);
});
}

现在,当我这样做时:

const import_call = import_demo_files({ 'demo_handle' : 'demo-2', 'step_name' : 'post' });
console.log(import_call);

console.log给我回 import_call事实上,这是一个 promise 并且已经解决。我非常喜欢这种方式return允许我摆脱 promise 链,但我不知道如何正确解决其中的 promise 链,所以很明显,它在未解决时被标记为已解决。

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

最佳答案

归约中的异步递归并不是最简单的入门知识,而且考虑到递归的每次迭代都与其他迭代相同,为什么您想要这样做也不是很明显。

通过将以下内容作为外部成员,减少/递归模式更容易理解:

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 可以直接更新。

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% 正确,但总体模式应该大致正确。准备好做一些工作。

关于javascript - 为什么我不能在已解决的 promise 上使用 then ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56756911/

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