如何串行链接 http 请求函数



我需要按顺序连续获取来自三个http请求的响应。

我能够使用嵌套函数来做到这一点。我还需要使用全局范围内最后一个请求的响应,这是我无法使用嵌套解决方案做到的。

var request = require("request");
httpRequest1((getRequest1) => {
console.log(getRequest1);
httpRequest2((getRequest2) => {
console.log(getRequest2);
httpRequest3((getRequest3) => {
console.log(getRequest3);
});
});
});
function httpRequest1 (callback){
var options = { method: 'POST',
url: };
request(options, function (error, response, body) {
if (error) throw new Error(error);
callback (body);
});}
function httpRequest2(callback){
var options = { method: 'POST',
url:  };
request(options, function (error, response, body) {
if (error) throw new Error(error);
callback(body);
});}
function httpRequest3(callback){
var options = { method: 'POST',
url: };
request(options, function (error, response, body) {
if (error) throw new Error(error);
callback(body);
});}
function httpRequest1 (callback){
var options = { method: 'POST', url: };
return new Promise(function (resolve, reject) {
request(options, function (error, response, body) {
if (error) return reject(error);
resolve(body);
});
});
}
function httpRequest2 (callback){
var options = { method: 'POST', url: };
return new Promise(function (resolve, reject) {
request(options, function (error, response, body) {
if (error) return reject(error);
resolve(body);
});
});
}
function httpRequest3 (callback){
var options = { method: 'POST', url: };
return new Promise(function (resolve, reject) {
request(options, function (error, response, body) {
if (error) return reject(error);
resolve(body);
});
});
}

承诺

httpRequest1()
.then(body1 => 
return httpRequest2();
)
.then(body2 => 
return httpRequest3();
)
.then(body3 => 
).catch(error => {
// error code
} );

异步/等待

function async getResponse() {
try {
const body1 = await httpRequest1();
const body2 = await httpRequest2();
const body3 = await httpRequest3();
} catch (e) {
console.log(e);
} 
}

更新

等待在正常功能下不起作用。如果使用 await ,则必须在 asyn 函数中使用它。如果你想从普通函数调用序列化异步函数,那么 promise 是更好的选择。但你可以使用另一种方式。假设我们有一个像上面这样的异步函数,返回响应

function async getResponse() {
try {
const body1 = await httpRequest1();
const body2 = await httpRequest2();
const body3 = await httpRequest3();
return { body1, body2, body3 }
} catch (e) {
console.log(e);
} 
}
function normalFunction() {
//  const res  = getResponse(); it will not work
getResponse()
.then(result  => {
// you will get the result here
})

}

在引擎盖下异步函数返回承诺结果。 这就是为什么我们可以这样写。

您应该考虑更现代的async/await模式,并使用它来解决承诺。它将使您的代码对您自己和他人更具可读性。

阅读此博客以获取更多详细信息,特别是您的案例中的"链接操作"部分:https://www.sitepoint.com/simplifying-asynchronous-coding-async-functions/

var request = require("request-promise");
( async () => {
const getRequest1 = await httpRequest1();
const getRequest2 = await httpRequest2();
const getRequest3 = await httpRequest3();
})();
async function httpRequest1() {
var options = {
method: 'POST',
url: ''
};
const body = await request(options)
if (!body) throw "error";
return body;
}
async function httpRequest2() {
var options = {
method: 'POST',
url: ''
};
const body = await request(options)
if (!body) throw "error";
return body;
}
async function httpRequest3() {
var options = {
method: 'POST',
url: ''
};
const body = await request(options)
if (!body) throw "error";
return body;
}

如果请求是独立的,则可以使用 Promise.all((。在调用 httpRequest2 等之前,您不必等待 httpRequest1 的响应。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

最新更新