如何在bluebird.js内部调用函数

时间:2018-08-24 04:04:33

标签: javascript bluebird

我正在尝试使用bluebirdjs获得一个promise函数。但是所有尝试都失败了,因为也许我不知道自己在做什么...?

我想获取文件位置,然后一个接一个地下载文件,然后推送到数组。

import * as Promise from 'bluebird';
fileFunction(files){
  Promise.map(files, function(file) {
    // Promise.map awaits for returned promises as well.
    //Promise.delay(1000);
     return this.getLocation(file); 
    },
  ).then((file) => {
      console.log('done')
    });

}

getLocation(file){
 if(file){
  return this._storage.ref(file).getDownloadURL().subscribe(url => 
      this.img_array.push(url)
  );
 }

当我调用返回this.getLocation(file)...时,我得到以下error bluebird.js:1545 Unhandled rejection TypeError: Cannot read property 'getLocation' of undefined ....bluebird.js

编辑正在使用的部分代码!

 fileFunction(files){
    return Promise.map(files, file => {
       return this.getDownloadUrl(file); 
    }).then(locations => {
        // add these locations onto this.img_array
        this.img_array.push(...locations);
        console.log('done');
        return locations;
    });
  }


getFiles(e): Promise<any>{
  this.outPutFiles = e;

 this.fileFunction(this.outPutFiles).then(locations => {
  locations.map((arr) => arr.subscribe((files) => this.downloadUrls.push(files)));
  }).catch(err => {
      console.log(err);
  });
}


getDownloadUrl(file){
  if(file){
    return this._storage.ref(file).getDownloadURL();
   } else {
    return Promise.reject(new Error('No file passed to getLocation'));
   }
}

1 个答案:

答案 0 :(得分:1)

this.getLocation(file)不起作用,因为您丢失了this的值,因为您位于Promise.map()回调中。请记住,除非您特别控制this的值,否则Javascript中的每个常规函数调用都会更改this的值。

您可以使用简单的箭头函数为您的回调解决该部分问题,如下所示:

fileFunction(files){
  return Promise.map(files, file => {
     return this.getLocation(file); 
  }).then(locations => {
      // add these locations onto this.img_array
      this.img_array.push(...locations);
      console.log('done');
      return locations;
  });
}

这假设this.getLocation(file)返回的承诺将解析为位置值。您确定这样做吗?似乎您遇到的问题可能不仅仅是您遇到的第一个错误。


而且,在进行旁聊之后,您还需要修复getLocation()以返回解析为所需URL的Promise。在firebase Javascript文档中查看,看来getDownloadURL()已经返回了一个可以解析为所需URL的promise。因此,您可以兑现承诺,让Promise.map()为您管理结果。

getLocation(file){
 if(file){
  return this._storage.ref(file).getDownloadURL();
 } else {
  return Promise.reject(new Error("No file passed to getLocation"));
 }
}

然后,您将像这样使用它:

obj.fileFunction(fileArray).then(locations => {
    console.log(locations);
}).catch(err => {
    console.log(err);
});