gpt4 book ai didi

javascript - 如何合并多个 MediaWiki API 请求的结果?

转载 作者:行者123 更新时间:2023-12-03 04:49:06 24 4
gpt4 key购买 nike

我有一个小型(工作)维基百科用户脚本,用于查询 MediaWiki API,然后再次查询第一个查询的每个结果,在控制台上打印“第二级”查询的结果(Firefox 52.0)/Linux):

mw.loader.using( [ 'mediawiki.api', 'mediawiki.ForeignApi' ] ).done( function () {
var api = new mw.Api();
api.get( {
action: 'query',
meta: 'globaluserinfo',
guiprop: 'merged'
} ).done( function ( data ) {
data.query.globaluserinfo.merged.forEach( function( element, index, array ) {
let url = element.url;
var remoteapi = new mw.ForeignApi( url + '/w/api.php' );
[mw.config.get('wgNamespaceIds').user, mw.config.get('wgNamespaceIds').user_talk].forEach( function( element, index, array ) {
remoteapi.get( {
action: 'query',
list: 'allpages',
apprefix: data.query.globaluserinfo.name,
apnamespace: element
} ).done( function (data2) {
for( var j = 0; j < data2.query.allpages.length; j++ )
console.log( url + '/wiki/' + data2.query.allpages[j].title );
});
} );
} );
} );
} );

我现在想用一个组合对话框替换单独的控制台输出(à la mw.loader.using( 'oojs-ui-windows' ).done( function () { OO.ui.alert( '所有结果: ' + results ); } );).

换句话说,我想在所有 API 查询完成后执行一个回调,访问/聚合/组合所有查询的结果。怎么才能做到这一点?

最佳答案

并行请求(与 Tim 的回答相同,只是 promise 更重一点):

mw.loader.using( [ 'mediawiki.api', 'mediawiki.ForeignApi' ] ).done( function () {
// get all accounts of user
new mw.Api().get( {
action: 'query',
meta: 'globaluserinfo',
guiprop: 'merged',
formatversion: 2,
errorformat: 'wikitext',
errorsuselocal: true
} )
// create a list of needed requests
.then( function ( data ) {
return data.query.globaluserinfo.merged.map( function( element, index, array ) {
let url = element.url;
let remoteapi = ( url === 'https:' + mw.config.get( 'wgServer' ) )
? new mw.Api()
: new mw.ForeignApi( url + '/w/api.php' ); if (url === 'https:' + mw.config.get('wgServer'));
let request = {
action: 'query',
generator: 'allpages',
gapprefix: data.query.globaluserinfo.name + '/',
gaplimit: 'max',
prop: 'info',
inprop: 'url'
};
return [
$.extend( { namespace: mw.config.get('wgNamespaceIds').user }, request ),
$.extend( { namespace: mw.config.get('wgNamespaceIds').user_talk }, request )
];
} );
} )
// fire the requests and merge promises
.then( function ( requests ) {
var promises = requests.map( function ( request ) {
return remoteapi.get( request ).then( function ( data ) {
return $.map( data.query.pages, function( val, key ) {
return val.fullurl;
} );
} ), function () {
console.log( 'FAIL = ' + JSON.stringify( arguments ) );
} );
} );
promises.push( mw.loader.using( 'oojs-ui-windows' ) );
return $.when.apply( $, promises ).then( function ( urls ) {
// last result is from mw.loader, discard it
urls.pop();
return urls;
} );
} )
// business logic
.done( function ( urls ) {
OO.ui.alert( 'All results: ' + urls.join( '\n' ) );
} ).fail( function () {
OO.ui.alert( 'FAIL!' );
} );
} );

如果您想限制并行性(如果您有很多帐户,这可能是个好主意),您可以将“触发请求” block 替换为类似的内容

.then( function ( requests ) {
var status = Array( requests.length );
let processNext = function () {
let index = status.indexOf( undefined );
if ( index >= 0 ) {
status[index] = true;
return remoteapi.get( requests[index] ).then( function ( data ) {
requests[index] = $.map( data.query.pages, function( val, key ) {
return val.fullurl;
} );
} ), function () {
console.log( 'FAIL = ' + JSON.stringify( arguments ) );
} ).then( processNext, processNext );
} else {
return $.Deferred().resolve();
}
}
let queue = Array( 5 ).map( function () {
processNext();
} ) );
queue.push( mw.loader.using( 'oojs-ui-windows' ) );
return $.when.apply( $, queue ).then( function () {
return requests;
} );
} )

(请注意,我没有进行任何测试。此外,这不处理延续,这太复杂了,无法在不进行测试的情况下尝试编写代码。也许 mw.Api 确实可以处理它,但永远不会检查过。无论如何,每个 wiki 的限制是 500 页(如果您是本地管理员,则为 5000 页),所以您可能应该很好。)

关于javascript - 如何合并多个 MediaWiki API 请求的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42744906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com