下面的代码有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
答案 0 :(得分:1)
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]);
}
}
在这里,所有请求均同时触发,并以不确定的顺序返回。
如果要使用异步,您需要做的是使您的请求返回承诺。在后台,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'));
答案 1 :(得分:1)
您可以使用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();
答案 2 :(得分:0)
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
块内的愚蠢语法错误
答案 3 :(得分:0)
作为导入其他库的替代方法。您可以简单地“实现”依赖于回调的request.post
方法。
async function loopAsync() {
var page = 0;
var last_page = array_data.length;
while (page < last_page) {
await new Promise((resolve, reject) => {
request.post({
url: 'http://localhost:3000',
form: 'test=' + array_data[page]
}, function(err,httpResponse,body){
if (err) reject(err);
else resolve({httpResponse,body});
});
page++;
});
}
}
loopAsync()
答案 4 :(得分:0)
在进行研发时,请求模块不会返回promise,因此需要使用请求承诺库。
let request = require('request');
let rp = require('request-promise');
var array_data = ['a', 'b', 'c', 'd', 'e'];
//with the use of request-promise library
async function loopAsync() {
var page = 0;
var last_page = array_data.length;
while (page < last_page) {
var options = {
method: 'POST',
uri: 'http://localhost:3000',
body: {
test: array_data[page]
},
json: true // Automatically stringifies the body to JSON
};
await rp(options);
page++;
}
}
loopAsync();