【发布时间】:2018-10-25 16:57:40
【问题描述】:
我有这个多重承诺请求,需要在继续下一组请求之前解决。
如果 printItemList 长度为 1,则可以正常工作。但是当它超过 2 个时,问题就开始发生了。
这个想法是在成功解决之前的 print_label 后触发 print_label。现在它会立即被解雇,而不是等待之前的请求完成。
这里有什么我做错了吗。
对此的任何帮助将不胜感激。
function print_batch(printItemList){
var chain = $.when();
var arr = [];
for(var batch_size = 0; batch_size < printItemList.length; batch_size ++){
(function(i){
chain = chain.then(function() {
$.when.apply($, arr).done(function(){
arr = print_label(printItemList[i]);
});
});
})(batch_size);
}
}
function print_label(selectedRow) {
var d = $.Deferred();
var chain = $.when();
var arr = [];
var request = buildLabel(selectedRow);
var noOfLabel = parseInt(selectedRow.labelCount);
var url = 'API_URL';
var epos = new epson.ePOSPrint(url);
for (var count = 0; count < noOfLabel; count++) {
(function(i){
chain = chain.then(function() {
var def = sendRequest(selectedRow, epos, request);
arr.push(def);
return def;
});
})(count);
}
return arr;
}
function sendRequest(selectedRow, epos, request){
var deferred = $.Deferred();
epos.send(request);
epos.onreceive = function(res) {
return deferred.resolve(res);
}
epos.onerror = function(err) {
return deferred.reject();
}
return deferred.promise();
}
【问题讨论】:
-
您正在调用 when.apply 多次,每次迭代一次。执行 when.apply 并不会阻止将来的 when.apply 异步运行。
-
但是我仍然需要确保在一批迭代中是否解决了多个 print_labels,对吧?
-
我无法完全满足您的整个程序化需求。我只是指出一个逻辑缺陷。
-
对不起,我不清楚。目标是在另一个 print_label 开始之前完成每个 print_label。但是,每个 print_label 都有多个要打印的标签。这就是我从 print_label 返回一系列承诺的原因。
-
永远不要使用
done,始终使用then。也不要忘记returnthen回调中的承诺,否则不会有任何链接。
标签: javascript jquery promise chaining resolve