我已经使用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;
}
答案 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,对吗?