如何从Promise内部将函数作为预订返回

时间:2018-06-21 06:25:30

标签: javascript angular promise subscribe

我一直在从这样的函数中返回请求:

makeConnection(data: any) {
    console.log('makeConnection');
    return this.api.get(data.url, data.dataToSend);
  }

所以我可以这样订阅:makeConnection.subscribe();

现在,我需要在进行API调用之前检查是否设置了名为urls的变量,所以我想到了制作这样的承诺函数

checkIfUrlsPresent():Promise<boolean> {
    return new Promise((resolve, reject) => {
      if(this.urls) {
        resolve(true);
        return;
      }
      this.api.get('/service', null).subscribe((response) => {
        console.log(response);
        this.urls = response.value.urls;
        resolve(true);        
      });
    });
  }

现在我的服务功能如下:

requestService(data) {
 this.checkIfUrlsPresent().then(() => {
      console.log('requestService');
      let dataToSend = this.api.createFormData(data);
      return this.api.post('/service/request/', dataToSend);
    })    
}

但是现在我将无法订阅requestService(data).subscribe()之类的函数 因此,我的问题是如何在添加此Promise的同时保持当前流程正常运行,或者在保持该流程正常运行的同时进行调用之前,是否有任何方法可以检查我的变量是否已设置。

注意:问题是我正在从一个文件进行所有api调用,并且调用这些API的函数过多,因此我需要这种方式,这样就无需在所有文件中进行更改我的页面以检查网址是否存在。

2 个答案:

答案 0 :(得分:1)

快到了。还需要在函数内部返回promise

requestService(data) {
    return this.checkIfUrlsPresent().then(() => { // return the promise
      console.log('requestService');
      let dataToSend = this.api.createFormData(data);
      return this.api.post('/service/request/', dataToSend);
    })    
}

答案 1 :(得分:1)

requestService返回链接的承诺,并在其上调用.then

requestService(data) {
  return this.checkIfUrlsPresent().then(() => {
    console.log('requestService');
    let dataToSend = this.api.createFormData(data);
    return this.api.post('/service/request/', dataToSend);
  })
}

// ..

instance.requestService(someData)
  .then(service => service.subscribe())