以下是具有大约1000个属性的元数据文件,并且很可能在不久的将来会增长更多。
metadata.js
exports = module.exports = Object.freeze({
'12345': {
'name': 'xyz',
'value': 'pqr',
'message': 'abc',
'link': 'http',
'desc': 'long'
},
.
.
...
});
这是执行逻辑,
的script.js
const itemList = require('./metadata');
method1()
.then((res) =>
method2(Object.keys(itemList))
)
.then((res) => {
const data = [];
res.forEach((element) => {
data.push({
'name': itemList[element.itemid].name,
'value': element.lastvalue,
'desc': itemList[element.itemid].desc,
});
});
console.log(JSON.stringify(data, null, 2));
return method3(data);
})
.then((res) => console.log(res))
.catch((err) => console.log(err));
method1和method2代码
const rp = require('request-promise-native');
class Client {
...
postRequest (method, params) {
return new Promise((resolve, reject) => {
rp({
'method': 'POST',
'uri': this.url,
'json': true,
'resolveWithFullResponse': true,
'body': {
'jsonrpc': '2.0',
'id': this.rpcid += 1,
'auth': this.authid,
method,
params
}
})
.then((res) => {
if (res.statusCode === 200 && typeof res.body !== 'undefined') {
resolve(res.body);
}
reject(res.body);
})
.catch((err) => reject(err));
});
}
method1 () {
return new Promise((resolve, reject) => {
const method = 'user.login';
const params = {
'user': this.user,
'password': this.password
};
this.postRequest(method, params)
.then((res) => {
if (res.result) {
this.authid = res.result;
resolve(res.result);
}
reject(res);
})
.catch((err) => reject(err));
});
}
method2 (itemids) {
return new Promise((resolve, reject) => {
const method = 'item.get';
const params = {
itemids,
'webitems': true,
'output': ['itemid', 'lastvalue']
};
this.postRequest(method, params)
.then((res) => {
if (res.result) {
resolve(res.result);
}
reject(res);
})
.catch((err) => reject(err));
});
}
}
exports = module.exports = Client;
method3代码
const rp = require('request-promise-native');
class Client {
...
postRequest (baseurl, body) {
return new Promise((resolve, reject) => {
rp({
'method': 'POST',
'uri': `${this.url}/${this.version}${baseurl}`,
'json': true,
'simple': false,
'resolveWithFullResponse': true,
body
})
.then((res) => resolve(res))
.catch((err) => reject(err));
});
}
method3 (arr) {
return new Promise((resolve, reject) => {
const baseurl = '/blah/blah';
this.postRequest(baseurl, arr)
.then((res) => {
if (res.statusCode === 200) {
resolve(`${res.body.status} done`);
}
reject(res);
})
.catch((err) => reject(err));
});
}
}
module.exports = Client;
这似乎对我来说很好,但整个执行过程需要60多秒才能完成。我想知道是否可以使用一些更有效的方法重写此代码可能使用Map()
或for
而不是forEach
或其他任何内容。请建议。
节点版本:v6.9.1
答案 0 :(得分:-1)
你可以做的几件事;