下面的代码有2个文件,并且有client.js,它调用服务器文件,但没有获得同步输出。我尝试了promise,bluebird,async_await,但没有成功。预期输出是控制台中的字母表序列。
不要使用settimout。
理解文件。server.js :服务器文件正在使用仅包含路由内容的NodeAPI。
Client.js :此文件中包含已尝试的逻辑
您需要使用两个控制台,第一个控制台运行server.js,第二个控制台运行client.js,输出将在server.js控制台中打印。
Expecting output is
a
b
c
d
e
/////////////////server.js/////////////////
var express = require('express');
var bodyParser = require('body-parser')
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.post('/', function (req, res) {
console.log(req.body.test)
res.status(200).send('ok');
});
var server = app.listen(3000, function () {
console.log('ok');
});
//////////////client.js///////////////////
//var Promise = require('bluebird');
var request = require('request');
console.log('server file called');
var array_data = ['a', 'b', 'c', 'd', 'e'];
// var promises = [];
// for(let i = 0; i < array_data.length; i++) {
// var promise = request.post({url: 'http://localhost:3000',form : {key:array_data[i]}});
// }
// var page = 0;
// var last_page = array_data.length;
// (function loop() {
// if (page < last_page) {
// request.post({
// url: 'http://localhost:3000',
// form: 'test=' + array_data[page]
// }, function (error, response, body) {
// page++;
// loop();
// });
// }
// }());
// async function loopAsync() {
// for (let i = 0; i < array_data.length; i++) {
// await request.post({
// url: 'http://localhost:3000',
// form: 'test=' + array_data[i]
// });
// }
// }
// loopAsync();
async function loopAsync() {
var page = 0;
var last_page = array_data.length;
while (page < last_page) {
await request.post({
url: 'http://localhost:3000',
form: 'test=' + array_data[page]
});
page++;
}
}
loopAsync();
[enter image description here][1]
[1]: https://i.stack.imgur.com/WVlut.png发布于 2019-01-18 17:56:41
您可以使用util.promisify。
以下是示例代码
const reqpost = util.promisify(request.post);
async function loopAsync() {
var page = 0;
var last_page = array_data.length;
while (page < last_page) {
await reqpost({
url: 'http://localhost:3000',
form: 'test=' + array_data[page]
});
page++;
} }
loopAsync();发布于 2019-01-18 16:56:37
request.post是一个接受请求选项和回调的函数,如下所示。
function request(letter, callback = () => {}) {
setTimeout(() => {
console.log(letter);
callback();
}, Math.random() * 1000);
}您所做的就是在不提供回调的情况下调用该函数:
async function clientWithRequest() {
const letters = ['a', 'b', 'c'];
for(let i = 0; i < letters.length; i++) {
await request(letters[i]);
}
}在这里,所有请求都被同时触发,并将以不确定的顺序返回。
如果你想使用异步,你需要做的就是让你的请求返回一个promise。在幕后,await实际上只是执行request.then(somethingElse())。因此,如果您更改请求以返回如下承诺:
function requestPromise(letter) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(letter);
resolve();
}, Math.random() * 1000);
});
}然后,您的等待代码将按预期工作。实际上它正在做的事情。
request('a').then(() => request('b')).then(() => request('c'));
发布于 2019-01-18 16:09:28
https://github.com/request/request#forms
因为您是通过Node自己形成表单数据字符串的
有没有可能让request通过他们的form方法帮助你形成编码后的字符串呢?
const jobs = [];
const array_data = [
'a',
'b',
'c',
'd',
'e',
];
require('request');
const request = require('request-promise');
async function loopAsync() {
for(const char of array_data) {
jobs.push(
request.post({
url: 'https://marble-scene.glitch.me/',
form: {
test: char
}
})
);
}
const output = await Promise.all(jobs);
output.forEach(char => console.log(char)); // # a b c d e
}
loopAsync();
编辑
只需编辑client.js代码,修复了jobs.push块中愚蠢的语法错误
https://stackoverflow.com/questions/54249746
复制相似问题