首页 > 解决方案 > 将异步数据从方法 1 返回到方法 2,同时不影响在方法 1 中获取异步数据的脚本

问题描述

在 TypeScript 中,我尝试在异步获取一些数据的私有方法中调用外部脚本SPCalendarPro。该脚本调用如下:

private _getSPCalendarPro() {
  const spcalpro: any = require('./spcalendarpro.js');
}

调用脚本后,我需要调用函数如下:

spcalpro.getCalendarEvents({
  listName: "StaffSchedule"
}).ready(function(data, obj) {
  if (obj.error) console.error( obj.error );
  console.table( data );
});

完整的方法如下:

private _getSPCalendarPro() {
  const spcalpro: any = require('./spcalendarpro.js');

  return spcalpro.getCalendarEvents({
    listName: "StaffSchedule"
  }).ready(function(data, obj) {
    if (obj.error) console.error( obj.error );
    console.table( data );
    return obj;
  });
}

该脚本返回一个数据和 obj 变量,我必须在另一个方法中使用它们。但是,当我从另一个函数调用上述方法时,我将 .ready() 函数作为文本返回。省略 .ready() 部分会返回获取的对象,但数据部分为空。这是因为数据是异步获取的,并且在方法返回时尚未解析。返回的对象包括:

listName:异步:字段:userEnvData:回调:CamlQuery:数据:

我从中调用 _getSPCalendarPro 方法的方法:

private _calendarData() {
  const calObj = this._getSPCalendarPro();
  const calObjData = calObj['data'];
  console.log(calObj);
  console.log(calObjData);
}

calObj 填充得很好,但 calObjData 未定义。我尝试使用 async / await 和 jquery deferred,但没有运气。我也找不到关于这个特定主题的答案。希望有人可以帮助我解决我做错了什么。

谢谢。

编辑 我试图为 _getSPCalendarPro 创建一个承诺,但我不确定如何以正确的方式执行此操作,因为外部脚本正在获取实际数据。

private _getSPCalendarPro(): Promise<void> {
  const spcalpro: any = require('./spcalendarpro.js');

  const spcal = spcalpro.getCalendarEvents({
    listName: "StaffSchedule"
  }).ready(function(data, obj) {
    if (obj.error) console.error( obj.error );
    console.table( data );
    return obj;
  });

  return spcal().then((response) => {
    return response;
  })

}

最终工作代码 感谢 Yoshi。

export interface ISPCalendarPro {
  data: any;
}

private _getSPCalendarPro(): Promise<ISPCalendarPro> {
  const spcalpro: any = require('./spcalendarpro.js');


  return new Promise((resolve, reject) => {
    const spcal = spcalpro.getCalendarEvents({
      listName: "StaffSchedule"
    }).ready(function(data, obj) {
      obj.error
      ? reject(obj.error) // reject on error
      : resolve(obj);    // or resolve
    })
  })
}

private _calendarData() {
  this._getSPCalendarPro().then((calData) => {
    console.log(calData);
  });
}

标签: javascripttypescriptasynchronousmethods

解决方案


我认为您可以返回一个承诺并使用提供的就绪回调解决它。

就像是:

type Data = unknown; // you'll need to fill this in.

class Something
{
  private _getSPCalendarPro(): Promise<Data> {
    const spcalpro: any = require('./spcalendarpro.js');

    // return a promise
    return new Promise((resolve, reject) => {
      // on ready
      spcalpro.getCalendarEvents({listName: "StaffSchedule"}).ready(function(data, obj) {
        obj.error
          ? reject(obj.error) // reject on error
          : resolve(data);    // or resolve
      });
    });
  }

  private async _calendarData() {
    try {
      // await the promise
      const data = await this._getSPCalendarPro();
    }
    catch (error) {
      console.error(error);
    }
  }
}

推荐阅读