我在UI上有一个包含3个选项的复选框,每个复选框选项将代表要完成的独立服务。但是,由于这些服务可以不同地调用,我需要想出一种方法来等待所有选定的选项完成,直到显示消息。
基本上,初步实施是这样的:if (doA) {
mysvc.doA();
}
if (doB) {
mysvc.doB();
}
if (doC) {
mysvc.doC();
}
window.alert('success');
然后我意识到我需要等待所有这些完成,所以我提出了这个:
if (doA) {
mysvc.doA();
}
if (doB) {
mysvc.doB();
}
if (doC) {
mysvc.doC();
}
setTimeout(function () {
window.alert('success');
}, 8000);
因为如果全部选中,操作通常最多需要8秒才能完成。但这显然不太理想。另外,我最终还是想为每个单独的操作提供反馈。任何帮助或资源将不胜感激。
答案 0 :(得分:1)
你可以使用$ q.all:
var promises = [];
if (doA) {
promises.push(mysvc.doA);
}
if (doB) {
promises.push(mysvc.doB);
}
if (doC) {
promises.push(mysvc.doC);
}
$q.all(promises).then(function(d){
window.alert('success');
})
答案 1 :(得分:0)
你能为每个电话附加一个变量,只有当它们全部成立时才显示成功吗?
enter code here
public PurchaseItem() {
this.setLayout(new BorderLayout());
JPanel top = new JPanel();
top.setLayout(new FlowLayout(FlowLayout.CENTER));
JPanel bottom = new JPanel();
bottom.setLayout(new FlowLayout(FlowLayout.CENTER));
bottom.add(Buy);
this.add(bottom, BorderLayout.SOUTH);
setBounds(100, 100, 450, 250);
setTitle("Purchase Item");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
top.add(new JLabel("Enter Item Key:"));
top.add(ItemNo);
top.add(new JLabel ("Enter Amount:"));
top.add(AmountNo);
top.add(check);
Buy.setText("Buy"); Buy.setVisible(true);
check.addActionListener(this);
Buy.addActionListener(this);
add("North", top);
JPanel middle = new JPanel();
middle.add(information);
add("Center", middle);
setResizable(true);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String ItemKey = ItemNo.getText();
String ItemAmount = AmountNo.getText();
String Name = StockData.getName(ItemKey);
int Yes = JOptionPane.YES_OPTION;
int No = JOptionPane.NO_OPTION;
int Amount = Integer.parseInt(ItemAmount);
int Key = Integer.parseInt(ItemKey);
int NewStock = StockData.getQuantity(ItemKey) - Amount;
double Total = Integer.parseInt(ItemAmount) * StockData.getPrice(ItemKey);
if (Name == null){
information.setText("There is no such item");
}
else if (Amount > StockData.getQuantity(ItemKey)) {
information.setText("Sorry there is not enough stock available");
}
else {
information.setText(Name + " selected: " + ItemAmount);
information.append("\nIndividual Unit Price: " + pounds.format(StockData.getPrice(ItemKey)));
information.append("\nCurrent Stock Available: " + StockData.getQuantity(ItemKey));
information.append("\nNew Stock After Sale: " + NewStock);
information.append("\n\nTotal: " + ItemAmount + " Units" + " at " + pounds.format(StockData.getPrice(ItemKey)) + " each");
information.append("\n= " + pounds.format(Total));
}
if (e.getSource() == Buy) {
JOptionPane.showConfirmDialog(null, "Buy " + ItemAmount + " Units" + " for " + pounds.format(Total) + "?");
if (Yes == JOptionPane.YES_OPTION) {
JFrame frame2 = new JFrame();
frame2.pack(); frame2.setBounds(250, 250, 500, 500); frame2.setTitle("Reciept"); frame2.setVisible(true);
JPanel middle = new JPanel();
middle.setLayout(new FlowLayout(FlowLayout.CENTER));
middle.add(reciept);
reciept.setBounds(260,260,400,400);
reciept.setVisible(true);
}
}
}
答案 2 :(得分:0)
最合适的方法是使用角度$q进行承诺。每个函数都应该返回一个promise,然后你可以获取所有3个promises并使用$ q.all将它们组合在一起并拥有一个只在所有3个完成后运行的回调函数。这是example with $http promises,但您可以通过使用$ q.defer()创建自己的承诺来完成任务:example using $q.defer()
q1 = $scope.q1 = $q.defer(),
q2 = $scope.q2 = $q.defer(),
p1 = $scope.q1.promise,
p2 = $scope.q2.promise;
$scope.fromThen = $q.all([
p1.then(thenFn),
p2.then(thenFn)
])
.then(function(values) {
console.log(values);
return values;
});