我正在尝试制作一个刮刀,但我似乎无法让代码以正确的顺序执行。我需要在标题和艺术家功能之后执行相册/ albumart请求功能。我知道node.js对于这类事情很奇怪,但我已经尝试过所有的东西,但仍然没有运气。
请原谅这个烂摊子和多余的调试代码。
当前输出:
TESTED!!!
req
No error
Pentemple - Pazuzu 2
Now Playing: Pentemple - Pazuzu 2
10
Pentemple
10
Pentemple
1
{ artist: '',
title: '',
album: '',
albumArt: '',
testval: 'TESTED!!!' }
xtest
答案 0 :(得分:0)
在大多数情况下,在Javascript中执行请求具有异步性质。这意味着请求不会阻止整个过程。在请求完成时执行和操作,使用回调。回调是在请求进入完成状态后添加到事件循环队列中的函数。最简单的方法(但肯定不是最好的方法)让reqeust一个接一个地运行是在第一个回调中调用第二个请求,在第二个回调中调用第三个请求,依此类推。
request(profileurl, function (error, response, html) {
console.log("req");
if (!error) {
// ...
request(albumurl, function (error, response, html) {
if (!error) {
// ...
request(albumurl, function (error, response, html) {
// ...
});
});
} else {
console.log("ERROR: " + error);
}
});
但是这种做法被认为是反模式的,被称为Pyramid of Doom,因为嵌套回调会使代码难以理解,难以测试且难以维护。
良好做法被视为使用promises。他们来到盒子里#34;与ES2015。但是如果您使用ES5,则应该为它们使用一些额外的模块,例如:request-promise或Q。
答案 1 :(得分:0)
JavaScript是异步的。如果请求相互依赖,我建议使用callbacks,这样当一个请求完成后,它会调用下一个请求。
答案 2 :(得分:0)
由于异步请求调用,响应可能不是为了保持顺序,因此您需要在先前请求的回调中进行下一个请求调用。以下是相同的例子 -
request(url1, function(err, res, html){
if(!err)
{
// url1 successfully returned , call another dependent url
request(url2, function(err2, res2, html2){
if(!err2)
{
// url2 successfully returned, go on with another request call and so on ...
}
});
}
else
{
// first call failed, return gracefully here --
callback(err); // if you have any
}
})
然而,正如之前的回答中所建议的那样,这是反模式,并将导致混乱或混乱的代码被称为厄运或回调地狱的金字塔。
我建议使用精彩的 async npm模块,然后将相同的代码写成 -
var async = require('async');
async.waterfall([
function(callback) {
request(url1, function(error, res, html){
callback(null, res, html);
});
},
function(res1, html1, callback) {
request(url1, function(error, res, html){
callback(null, res1, html1, res, html);
});
} // ... AND SO ON
], function (err, result) {
// the result contains the response sent by the last request callback
if(!err)
{
// use your data
}
});