【发布时间】:2016-09-22 08:15:19
【问题描述】:
更新
好的,所以我解决了。使用 highland.js 时,我需要一个 .done() 来完成流。
var requests = [];
_(fs.createReadStream("small.txt", { encoding: 'utf8' }))
.splitBy('-----BEGIN-----\n')
.splitBy('\n-----END-----\n')
.filter(chunk => chunk !== '')
.each(function (x) {
requests.push(function (next) {
Helpers.Authenticate()
.then(function (response1) {
return Helpers.Retrieve();
})
.then(function (response2) {
return Helpers.Retrieve();
})
.then(function () {
next();
});
});
})}).done(function () {
async.waterfall(requests);
});
request 数组现在正在工作。
我在使用电子和链式承诺时遇到了一些问题。这是我在主进程中运行的代码。
var request = require('request-promise');
request.post(tppAuthenticate)
.then(function (responseFromFirstPost) {
var newoptions = tppRetrieveCertificate(responseFromFirstPost.APIKey)
return request.post(newoptions) // The return is important
})
.then(function (responseFromSecondPost) {
console.log(responseFromSecondPost)
})
整个代码块通过遍历文件的每一行来执行数千次调用。第一个请求被连续触发,但这似乎显着阻止/限制了仅定期调用的第二个请求。
我希望按顺序调用整个块,但这似乎没有发生。
这是我的完整代码块,包括迭代:
const _ = require('highland');
const request = require('request-promise');
fs.createReadStream(files[0], { encoding: 'utf8' }))
.splitBy('-----BEGIN -----\n')
.splitBy('\n-----END -----\n')
.filter(chunk => chunk !== '')
// .each(_.log);
.each(function (x) {
request.post(tppHelpers.Authenticate)
.then(function (responseFromFirstPost) {
const newoptions = tppHelpers.tppRetrieveCertificate(responseFromFirstPost.APIKey)
console.log(newoptions)
return request.post(newoptions) // The return is important
})
.then(function (responseFromSecondPost) {
console.log(responseFromSecondPost)
event.sender.send('selected-directory', responseFromSecondPost)
})
});
【问题讨论】:
-
您能否澄清一下:您是否希望第 2 行的请求在第 1 行的两个请求都完成后开始?我理解你的描述的方式,你似乎同时创建了数千个请求,这肯定会影响辅助请求。
-
@kraf 我也是这么读的:开始了一大堆请求,可能会压倒事件队列或网络,这意味着辅助请求将被严重延迟。
-
基本上第一个和第二个响应是链接的,需要立即串联执行,否则API密钥超时。第二个请求正在执行但非常缓慢,它们被第一个请求阻止。希望这会让它更清楚。
-
你是说我这里实际上有 3 个请求?
-
@user1513388 你说的是“整个代码块执行了几千次”。如果您不正确地执行此操作,您将启动数千个并发 HTTP 请求。你能展示一下你是如何实现迭代的吗?
标签: javascript node.js electron chaining