request.post的嵌套promise

时间:2017-10-31 19:57:04

标签: node.js

我正在创建一个POST请求,如果请求成功,我正在创建一个Cisco Spark聊天室(类似于slack)。在POST请求中,我正在更新POST请求成功中的变量(数组)的一部分以及Cisco Spark聊天室创建成功中的变量的其他部分。

所以我认为我需要嵌套的承诺,以便我可以根据需要提供整个变量。但我不知道该怎么做。

原始代码如下所示:

var request = require('request');
var array = [];
  myObj = new Object()
  request.post({
          url: urlServiceNow,
          headers: headers,
          rejectUnauthorized: false,
          requestCert: false,
          agent: false,
      },function (response, err, body){
          var createJSON = JSON.parse(body);
          array.push(createJSON.result.sys_id);
      }.bind(this));
    ciscospark.rooms.create({title: `AppDNotification`})
      .then((room) => {
        array.push(room.id)
        myObj[valEventTime] = array;
        imdb.push(myObj)
        return Promise.all([
          //more code
        ]).catch((error) => {
          console.log(`Error: \n${error}`);
        })
        .then(() => ciscospark.messages.create({
            markdown: messageToSend,
            roomId: room.id
          }))
          .catch( (error) => {
            console.log(`Error: \n${error}`);
        });
      });

我在.bind之后使用.then更新了代码,如下所示

request.post({
        url: urlServiceNow,
        headers: headers,
        rejectUnauthorized: false,
        requestCert: false,
        agent: false,
    },function (response, err, body){
        var createJSON = JSON.parse(body);
        array.push(createJSON.result.sys_id);
    }.bind(this))
    .then(() => ciscospark.rooms.create({title: `AppDNotification`}))
    .then((room) => {

       //rest of the code
    })

但我收到错误

TypeError: request.post(...).then is not a function

请建议。

2 个答案:

答案 0 :(得分:2)

查看请求的文档promises are not supported

  

请求本身支持流式传输和回调接口。如果您希望请求返回Promise,则可以使用备用接口包装器来请求。如果你喜欢使用Promises,或者你想在ES2017中使用async / await,这些包装器会很有用。

文档继续建议使用支持承诺的几个不同版本中的一个:

  

request-promise(使用蓝鸟承诺)
  request-promise-native(使用原生承诺)
  request-promise-any(使用任何承诺的承诺)

答案 1 :(得分:0)

使用request-promise

解决了这个问题
var rp = require('request-promise');

// Configure the POST request
var optionsPOST = {
    url: urlServiceNow,
    method : 'POST',
    headers : headers,
    rejectUnauthorized: false,
    requestCert: false,
    agent: false
}

rp(optionsPOST)
    .then(function (parsedBody) {
        var post = JSON.parse(parsedBody);
        console.log(post)
        console.log(post.result.sys_id)
        ciscospark.rooms.create({title: `AppDNotification`})
          .then((room) => {

            return Promise.all([
              ciscospark.memberships.create({
                roomId: room.id,
                personEmail: `abc@example.com`
              }),
              ciscospark.memberships.create({
                roomId: room.id,
                personEmail: `abc@example.com`
              }),
            ]).catch((error) => {

              //Handle Error Here
              console.log(`Error: \n${error}`);

            })
            .then(() => ciscospark.messages.create({
                markdown: "Hi",
                roomId: room.id
              }))
              .catch( (error) => {
                console.log(`Error: \n${error}`);
            });
          });
    })
    .catch(function (err) {
        console.log("fail")
    });