Javascript 节点中的请求承诺未按预期工作
我正在使用。我一直在遵循文档,并且相信我应该正确设置所有内容,但是,我发现以下错误: 未处理的拒绝状态代码错误:400-“{\n\“error\”:{\nJavascript 节点中的请求承诺未按预期工作,javascript,node.js,request,promise,Javascript,Node.js,Request,Promise,我正在使用。我一直在遵循文档,并且相信我应该正确设置所有内容,但是,我发现以下错误: 未处理的拒绝状态代码错误:400-“{\n\“error\”:{\n \“状态\”:400\n \“消息\”:“无效id \”\n}\n}” 新状态代码错误(/Users/fitz035/Desktop/sony/traveland/node_modules/request promise/node_modules/request promise core/lib/errors.js:32:15) 我的代码如下
\“状态\”:400\n \“消息\”:“无效id \”\n}\n}” 新状态代码错误(/Users/fitz035/Desktop/sony/traveland/node_modules/request promise/node_modules/request promise core/lib/errors.js:32:15) 我的代码如下所示
var request = require('request');
var rp = require('request-promise');
rp('apiOne' + mood)
.then(function(error, response, body) {
console.log(body)
}
}).then(function(error) {
for (var i = 0; i < array; i++) {
rp('apiTwo', function(error, response, body) {
console.log(body))
});
}
}).then(function(error, response, body) {
rp('apiThree' + songListUrl, function(error, response, body) {
console.log(body))
});
})
.catch(function(err) {
console.log(err)
});
您正在调用
rp
,就好像它是request
在几个地方,例如在for
循环中。由于您没有对这些调用的返回值进行任何处理,因此您没有处理这些承诺的解决或拒绝,因此会收到错误警告,提示您存在未处理的拒绝
使用返回值的调用看起来也不正确。您在declare NodeJS callback样式的参数列表中传递的回调,但承诺不是这样工作的。不是将错误或null
作为第一个参数传递给单个回调,而是为解析(成功)和拒绝(错误)注册单独的回调
我建议详细研究上面的例子
关于你的后续行动: 这是正确的方法吗
var options = {
uri: 'https://jsonplaceholder.typicode.com/posts/1',
json: true
}
rp(options).then(function(data){
console.log(data)
var optionsTwo = {
uri: 'http://www.google.com',
}
rp(optionsTwo).then(function(data){
console.log(data)
console.log(answer);
})
})
var options = {
uri: 'https://jsonplaceholder.typicode.com/posts/1',
json: true
}
rp(options).then(function(data){
console.log(data)
var optionsTwo = {
uri: 'http://www.google.com',
}
rp(optionsTwo).then(function(data){
console.log(data)
console.log(answer);
})
})
不,这仍然不能处理拒绝。如果您的目标是串联(而不是并行)执行这两个请求,请参阅注释:
var options = {
uri: 'https://jsonplaceholder.typicode.com/posts/1',
json: true
};
rp(options)
.then(function(data){
console.log(data)
var optionsTwo = {
uri: 'http://www.google.com'
};
return rp(optionsTwo).then(function(data){ // Note the return
console.log(data)
console.log(answer); // Don't know where `answer` is coming from...?
// Note that by not returning anything, you convert
// the resolution value to `undefined`. That's fine if
// you don't need it, but it's worth pointing out.
});
})
.catch(function(error) {
// One of the two operations above failed
});
我认为我对这一工作原理的核心理解需要改进。我的印象是,
then
函数在前一个函数返回response@phantom:在承诺得到解决或被拒绝之前,您传递的回调将不会被调用,是的。更具体地说:作为的第一个参数传递给的回调只有在承诺得到解决时才会被调用;如果将第二个回调作为第二个参数传递,则在拒绝承诺之前/除非拒绝承诺,否则不会调用该回调。作为catch
的唯一参数传递的回调与then
的第二个参数类似:它仅在承诺被拒绝时调用。@tj我已更新了我的问题。它似乎起作用了。你能确认这是正确的方法吗,因为你是这里的大师:-)?@phantom::-)我已经添加到了答案中。