Как я могу вызвать функцию, которая возвращает обещание для каждого массива элементов в цикле - PullRequest
1 голос
/ 16 марта 2020
public takePicture() { 
 let options: CaptureImageOptions = { limit: 3 };
    return this.mediaCapture.captureImage(options)
      .then((data: MediaFile[]) => {
        console.log(data);
        for (let i = 0; i <= data.length; i++) {
          return this.beforeSave(data[i].fullPath).then((save) => {
            this.save(save);
          });
        }
      })
      .catch((err: CaptureError) => { console.log(err) });
}

Я пытаюсь для каждого изображения, которое я снимаю со своей камеры на телефон, вызывать beforeSave (). Однако только для первого обещание возвращается. Как мне реализовать свой код, чтобы сделать это для каждого элемента в моем массиве данных?

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Если цель здесь состоит в том, чтобы сохранить все изображения, которые были захвачены, и сообщить о завершении или ошибке вызывающей стороне, тогда вы можете изменить значение на .map() для сбора массива обещаний и использовать Promise.all() для мониторинга этого массива обещаний , Этот код выглядит следующим образом:

public takePicture() { 
    let options: CaptureImageOptions = { limit: 3 };
    return this.mediaCapture.captureImage(options).then((data: MediaFile[]) => {
        console.log(data);
        // collect array of promises and use Promise.all() to monitor them
        return Promise.all(data.map(item => {
            return this.beforeSave(item.fullPath).then((save) => {
              return this.save(save);
            });
        }));
    }).catch((err: CaptureError) => { 
        // log error, then rethrow so caller can see the error
        console.log(err) 
        throw err;
    });
}

К вашему сведению, предполагается, что вы используете this.beforeSave() и this.save() правильно. Я не знаю этих интерфейсов, так что я просто возглавил это.

1 голос
/ 16 марта 2020

Вы возвращаетесь сразу, и для l oop не завершена. Попробуйте удалить return.

public takePicture() { 
 let options: CaptureImageOptions = { limit: 3 };
    return this.mediaCapture.captureImage(options)
      .then((data: MediaFile[]) => {
        console.log(data);
        for (let i = 0; i < data.length; i++) {
          this.beforeSave(data[i].fullPath).then((save) => { // !! Remove the return here
            this.save(save);
          });
        }
      })
      .catch((err: CaptureError) => { console.log(err) });
}
...