在特殊情况下,我需要一个小部件,它具有一个基于第三方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();
如何以某种方式从DB同步获取值?
答案 0 :(得分:0)
在Apostrophe 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
函数而不进行回调。