如何根据第 3 方 API 响应添加小部件字段?
How to add widget fields based on 3rd party API response?
在特殊情况下,我需要一个小部件,它具有基于第 3 方 API 响应的附加字段。现在,问题是我必须等待 API 请求给出响应,并且 beforeConstruct 也变为异步,结果是构造函数填充 运行 并早于 beforeConstruct 和在管理面板新字段不可见。
const request = require( 'request-promise' );
module.exports = {
extend: 'apostrophe-widgets',
label: 'Widget name',
beforeConstruct: async function( self, options )
{
var fields = [];
var arrangements = [];
var optionalFields =
{
name: 'optionalFields',
label: 'Optional Fields',
fields: []
};
const apiResponse = await request( {
method: 'POST',
body: {
// criteria for search
},
uri: API_ENDPOINT,
json: true
} );
var newField =
{
name: apiResponse.fieldName,
label: apiResponse.fieldName,
type: 'string',
};
fields.push( contact );
optionalFields.fields.push( apiResponse.fieldName );
arrangements.push( optionalFields );
options.addFields = fields.concat( options.addFields || [] );
options.arrangeFields = arrangements.concat( options.arrangeFields || [] );
}
};
你有什么想法无论如何都要等待 beforeConstruct 完成吗?
还有一个问题(写在这里因为基本上是同一个问题):如果我必须向基于数据库片段类型集合的小部件添加新字段:
await self.apos.docs.getManager( 'optionals' ).find( req, {}, { trash: false } ).toArray();
我能以某种方式同步从数据库中获取值吗?
在撇号 2.x 中,由于遗留原因,如果您希望 beforeConstruct
、construct
或 afterConstruct
等待异步工作完成,则必须使用回调。但是你仍然可以在内部使用 async/await
;请务必 try/catch
并适当处理回调:
beforeConstruct: async function(self, options, callback) {
try {
const info = await someApiCallHere();
options.addFields = [ ... use info here ... ];
return callback(null);
} catch (e) {
return callback(e);
}
}
在 Apostrophe 3.x 中,将支持仅使用 async
函数而无需回调。
在特殊情况下,我需要一个小部件,它具有基于第 3 方 API 响应的附加字段。现在,问题是我必须等待 API 请求给出响应,并且 beforeConstruct 也变为异步,结果是构造函数填充 运行 并早于 beforeConstruct 和在管理面板新字段不可见。
const request = require( 'request-promise' );
module.exports = {
extend: 'apostrophe-widgets',
label: 'Widget name',
beforeConstruct: async function( self, options )
{
var fields = [];
var arrangements = [];
var optionalFields =
{
name: 'optionalFields',
label: 'Optional Fields',
fields: []
};
const apiResponse = await request( {
method: 'POST',
body: {
// criteria for search
},
uri: API_ENDPOINT,
json: true
} );
var newField =
{
name: apiResponse.fieldName,
label: apiResponse.fieldName,
type: 'string',
};
fields.push( contact );
optionalFields.fields.push( apiResponse.fieldName );
arrangements.push( optionalFields );
options.addFields = fields.concat( options.addFields || [] );
options.arrangeFields = arrangements.concat( options.arrangeFields || [] );
}
};
你有什么想法无论如何都要等待 beforeConstruct 完成吗?
还有一个问题(写在这里因为基本上是同一个问题):如果我必须向基于数据库片段类型集合的小部件添加新字段:
await self.apos.docs.getManager( 'optionals' ).find( req, {}, { trash: false } ).toArray();
我能以某种方式同步从数据库中获取值吗?
在撇号 2.x 中,由于遗留原因,如果您希望 beforeConstruct
、construct
或 afterConstruct
等待异步工作完成,则必须使用回调。但是你仍然可以在内部使用 async/await
;请务必 try/catch
并适当处理回调:
beforeConstruct: async function(self, options, callback) {
try {
const info = await someApiCallHere();
options.addFields = [ ... use info here ... ];
return callback(null);
} catch (e) {
return callback(e);
}
}
在 Apostrophe 3.x 中,将支持仅使用 async
函数而无需回调。