javascript - 将异步数据从方法 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);
});
}
解决方案
我认为您可以返回一个承诺并使用提供的就绪回调解决它。
就像是:
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);
}
}
}
推荐阅读
- linux - Putty Search - String followed by one but not two symbols
- javascript - 将所有状态属性传递给函数,除了一个
- android - Android Emulator not starting - Application not responding
- python - 如何将表模式导出到 csv 文件中
- c# - 使用 C# microsoft bot 框架通过 Directline 包含附加参数
- r - 替换的长度为零:来自 R 中阿拉巴马州包的 auglag 函数
- c# - Azure Key Vault 机密访问间歇性地无法连接套接字异常
- html - 将轮播添加到页面
- java - 运行 jcstress 期间出错:VM 选项“StressLCM”正在开发中,仅在 VM 的调试版本中可用
- git - 为什么 git pull origin develop --rebase 没有 git pull origin develop 会导致冲突?