函数结束后循环打印检索多个数据
Loop print after function ends retrieve multiple data
我创建了一个网络应用程序来存储客户要求的报价。
一个引文可以是多个,所以当我打印一个引文时,我可能必须打印连接的引文。
为了做到这一点,我尝试在函数完成后进行打印以从 json 检索数据并构建页面。
可能有多个数据,所以当我单击打印按钮时,该函数必须读取 json 数据以获得所有连接的报价,构建页面并打印它,并对任何数据执行此操作引用
该函数从服务器读取行情数据
function prev_edit(id){
return $.ajax({
type : 'POST',
url : 'json/get.php?t=2&p='+id,
dataType : 'json',
encode : true
})
.then(function(data) {
var prom;
if ((data)["success"]===false) {
...do something...
prom=$("#edit").show("slow").promise();
}
return prom;
});
};
当我点击打印按钮时,此功能有效
$('#prev_print').on("click",(function( event ) {
$.ajax({
type : 'POST',
url : 'json/get.php?multi='+$("#id").val(),
dataType : 'json',
encode : true
}).then(function(data) {
if ((data)["success"]===true) {
$.each((data)["multi"], function( i, n ) {
prev_edit(n).then(function(){
window.print();
});
});
}
});
}));
我也尝试了延迟对象,但似乎 prev_edit(n)。然后 函数结束时不会等待。
你可以试试:
- 而不是使用简单的
.each()
,序列化 data.multi
的迭代。
- 正在等待
$("#edit").show('slow').promise()
归还。
您还应该:
- 捕获并吞下由
prev_edit()
过程引起的错误
- 用终端捕获任何意外错误
.catch()
你应该得到这样的结果:
function prev_edit(id) {
return $.ajax({
'type': 'POST',
'url': 'json/get.php?t=2&p=' + id,
'dataType': 'json',
'encode': true
})
.then(function(data) {
if (!data.success) {
...do something...
return $("#edit").show('slow').promise();
// ^^^^^^
}
throw new Error('prev_edit failed');
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
});
};
$('#prev_print').on('click', function(event) {
$.ajax({
'type': 'POST',
'url': 'json/get.php?multi=' + $('#id').val(),
'dataType': 'json',
'encode': true
})
.then(function(data) {
if (data.success) {
// serialize the preview/print process with data.multi.reduce(...)
data.multi.reduce(function(promise, n) {
return promise.then(function() {
return prev_edit(n)
.then(function() {
window.print();
})
// catch possible error arising from prev_edit().
.catch(function(error) {
console.log(error);
// swallow (don't rethrow) the error.
});
});
}, Promise.resolve());
}
})
.catch(function(error) {
console.log(error);
// no need to rethrow the error as this is top-level code.
});
});
您可能需要在序列化 preview/print 过程中添加一些延迟,以便给自己时间查看预览。或者,您可以提供一个按钮,需要单击该按钮才能移动到下一个 preview/print。两者都非常简单。
我创建了一个网络应用程序来存储客户要求的报价。
一个引文可以是多个,所以当我打印一个引文时,我可能必须打印连接的引文。
为了做到这一点,我尝试在函数完成后进行打印以从 json 检索数据并构建页面。
可能有多个数据,所以当我单击打印按钮时,该函数必须读取 json 数据以获得所有连接的报价,构建页面并打印它,并对任何数据执行此操作引用
该函数从服务器读取行情数据
function prev_edit(id){
return $.ajax({
type : 'POST',
url : 'json/get.php?t=2&p='+id,
dataType : 'json',
encode : true
})
.then(function(data) {
var prom;
if ((data)["success"]===false) {
...do something...
prom=$("#edit").show("slow").promise();
}
return prom;
});
};
当我点击打印按钮时,此功能有效
$('#prev_print').on("click",(function( event ) {
$.ajax({
type : 'POST',
url : 'json/get.php?multi='+$("#id").val(),
dataType : 'json',
encode : true
}).then(function(data) {
if ((data)["success"]===true) {
$.each((data)["multi"], function( i, n ) {
prev_edit(n).then(function(){
window.print();
});
});
}
});
}));
我也尝试了延迟对象,但似乎 prev_edit(n)。然后 函数结束时不会等待。
你可以试试:
- 而不是使用简单的
.each()
,序列化data.multi
的迭代。 - 正在等待
$("#edit").show('slow').promise()
归还。
您还应该:
- 捕获并吞下由
prev_edit()
过程引起的错误 - 用终端捕获任何意外错误
.catch()
你应该得到这样的结果:
function prev_edit(id) {
return $.ajax({
'type': 'POST',
'url': 'json/get.php?t=2&p=' + id,
'dataType': 'json',
'encode': true
})
.then(function(data) {
if (!data.success) {
...do something...
return $("#edit").show('slow').promise();
// ^^^^^^
}
throw new Error('prev_edit failed');
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
});
};
$('#prev_print').on('click', function(event) {
$.ajax({
'type': 'POST',
'url': 'json/get.php?multi=' + $('#id').val(),
'dataType': 'json',
'encode': true
})
.then(function(data) {
if (data.success) {
// serialize the preview/print process with data.multi.reduce(...)
data.multi.reduce(function(promise, n) {
return promise.then(function() {
return prev_edit(n)
.then(function() {
window.print();
})
// catch possible error arising from prev_edit().
.catch(function(error) {
console.log(error);
// swallow (don't rethrow) the error.
});
});
}, Promise.resolve());
}
})
.catch(function(error) {
console.log(error);
// no need to rethrow the error as this is top-level code.
});
});
您可能需要在序列化 preview/print 过程中添加一些延迟,以便给自己时间查看预览。或者,您可以提供一个按钮,需要单击该按钮才能移动到下一个 preview/print。两者都非常简单。