Цепочка HTTP-запросов в Electron с использованием запроса-обещания
ОБНОВИТЬ
ОК, так что я решил это. При использовании 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)
})
});
1 ответ
Если вы не хотите запускать каждый запрос сразу, что похоже на чтение ваших комментариев, вместо того, чтобы выполнять все параллельно:
.each(function (x) {
// ...
});
Вместо этого вы можете создать пустой массив перед запуском fs.createReadStream
:
var requests = [];
и в вашем each
Обратный вызов создать функции для добавления в ваш массив:
.each(function (x) {
requests.push(function (next) {
// ...
next();
});
});
и затем вы можете запустить его последовательно с:
async.series(requests);
с использованием async
модуль.
Просто убедитесь, что next()
вызывается в нужный момент, например в последний .then()
обратный вызов данной цепочки обещаний.
Другой способ будет использовать async.queue
:
var queue = async.queue(function(x, callback) {
//
callback();
}, 1);
(Здесь убедитесь, что callback()
называется когда надо. Вместо 1 в конце вы можете использовать другой номер для параллельного выполнения определенного количества запросов.)
И тогда в вашем each
Перезвоните:
.each(function (x) {
queue.push(x);
});
См. Документацию async.queue для получения дополнительной информации. (Спасибо Робертклепу за упоминание async.queue()
в комментариях.)
Кстати, вы даже используете x
в ваших итерациях или вы просто делаете кучу одинаковых запросов для каждой строки вашего ввода?
пример
Чтобы ответить на ваш вопрос из комментариев, вот способ построить массив функций.
Если это был ваш оригинальный код:
yourStream.each(function (x) {
doRequest1()
.then(function (response1) {
return doRequest2();
})
.then(function (response2) {
return doRequest3();
});
});
Тогда вы могли бы создать этот массив функций с чем-то вроде:
var requests = [];
yourStream.each(function (x) {
requests.push(function (next) {
doRequest1()
.then(function (response1) {
return doRequest2();
})
.then(function (response2) {
return doRequest3();
})
.then(function () {
next();
});
});
});
И вы можете запустить их с:
async.series(requests);
Надеюсь, поможет.