承诺中的代码。然后在承诺结束前解雇

时间:2017-11-25 17:59:31

标签: arrays angular typescript ionic-framework promise

我有这个代码...对于我曾经在这一段时间的混乱感到抱歉:

loadAvailabilities() {

    let promises = [];
    let promises2 = [];
    let indexi = 0;
    //return new Promise((resolve, reject) => {
      this.appointments = this.af.list('/appointments', { query: {
        orderByChild: 'selected',
        limitToFirst: 10
      }});
      let mapped;
      this.subscription2 = this.appointments.subscribe(items => items.forEach(item => {
        //promises.push(new Promise((resolve, reject) => {
          console.log(item);
          let userName = item.$key;
          //this.availabilities = [];
          for(let x in item) {
            let month = x;
            console.log(x + "      month");

            this.appointmentsMonth = this.af.list('/appointments/' + userName + '/' + month);
            this.subscription3 = this.appointmentsMonth.subscribe(items => items.forEach(item => {
                this.startAtKeyAvail = item.$key;
                //console.log(JSON.stringify(item) + "           item");
                let date = new Date(item.date.day * 1000);
                let today = new Date();
                console.log(date.getMonth() + "==" + today.getMonth()  + "&&" + date.getDate() + "==" + today.getDate());
                console.log("IN LOAD AVAILABILITIES *(*((**(*(*(*(*(*(*&^^^^%^%556565656565");
                if(date.getMonth() == today.getMonth() && date.getDate() == today.getDate()) {
                  console.log("            inside the if that checks if its today");
                  console.log(item.reserved.appointment + "                *************appointment");
                  //let counter = 0;
                  //mapped = item.reserved.appointment.map((r) => {
                  //item.reserved.appointment.forEach((r, index) => {
                    for(let r of item.reserved.appointment) {
                      promises.push(new Promise((resolve, reject) => {
                        if(r.selected == true) {
                          //this.renderer.setElementStyle(this.noavail.nativeElement, 'display', 'none');

                          let storageRef = firebase.storage().ref().child('/settings/' + userName + '/profilepicture.png');

                          let obj = {'pic':"", 'salon': userName, 'time': r.time};

                          storageRef.getDownloadURL().then(url => {
                            console.log(url + "in download url !!!!!!!!!!!!!!!!!!!!!!!!");
                            obj.pic = url;
                            this.availabilities.push(obj);
                            console.log(JSON.stringify(this.availabilities));
                            resolve();
                          }).catch((e) => {
                            console.log("in caught url !!!!!!!$$$$$$$!!");
                            obj.pic = 'assets/blankprof.png';
                            this.availabilities.push(obj);
                            console.log(JSON.stringify(this.availabilities));
                            resolve();
                          });
                        }
                      }))

                  }

                }

               }))
             }
          }))
            //}));

          Promise.all(promises).then(() => {
            console.log("in load availabilities ......... ")
            console.log(JSON.stringify(this.availabilities));

            this.availabilities.sort(function(a,b) {
              return Date.parse('01/01/2013 '+a.time) - Date.parse('01/01/2013 '+b.time);
            });

            console.log('*****previous******');
            console.log(JSON.stringify(this.availabilities));
            console.log('*****sorted********');

            for(let i of this.availabilities) {
              console.log(i.time + "          this is itime");
              let date = new Date('01/01/2013 ' + i.time);
              console.log(date + "          this is date in idate");
              let str = date.toLocaleTimeString('en-US', { hour: 'numeric', hour12: true, minute: 'numeric' });
              console.log(str);
              i.time = str;
            }
          });
      //}))



    //})

  }

我可以从日志消息中看出storageRef.getDownloadURL()函数发生在我的页面加载结束时...这是对象实际被推送到this.availabilities的地方(最终用于填充)一个列表)。 Promise.all .then()中的代码实际上会在任何内容被推送到this.availabilities之前触发,因此当排序发生时,它是一个空数组,没有任何内容被排序。

1 个答案:

答案 0 :(得分:0)

我在每个forEach循环中使用了一个promise。我将所有的promises推送到同一个array并使用Promise.all(array).then(...)如何在上面使用它 - 并且promises完成了它们的工作 - 数组被排序,因为一切都是异步发生的。

相关问题