Javascript 节点中的请求承诺未按预期工作

Javascript 节点中的请求承诺未按预期工作,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\“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)

我的代码如下所示

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::-)我已经添加到了答案中。