angularjs承诺在显示消息之前等待3个服务完成

时间:2015-12-04 20:28:35

标签: javascript angularjs

我在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秒才能完成。但这显然不太理想。另外,我最终还是想为每个单独的操作提供反馈。任何帮助或资源将不胜感激。

3 个答案:

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