回调问题 - 带有Nodejs运行时的OpenWhisk

buk*_*api 2 node.js openwhisk ibm-cloud

我正在BlueMix OpenWHisk中开发一个模块,在Cloudant Feed更改之后,我需要调用一个url,这将更新另一个平台上的一些细节.我正在使用nodejs运行时.

问题是我的行动是等待POST请求的结果到上面提到的url.如果POST成功,那么我应该执行下一个事件序列.

问题:

  1. 如何在执行下一个序列之前等待POST请求的结果?

  2. 是否可以等待并返回POST请求的结果.

发布我的代码

   /**
  *
  * main() will be invoked when you Run This Action
  *
  * @param OpenWhisk actions accept a single parameter, which must be a JSON object.
  *
  * @return The output of this action, which must be a JSON object.
  *
  */

const util = require('util');
var http = require('http');

function main(params) {

    // Updated the status of the User
    params.status ="updated1";

    var options = {
                host: "myhost.mybluemix.net",
                path: "/addtoimc",
                method: "POST",
                headers: {
                    "Content-Type": "text/plain"
                }
            };


      return {message : addtoIMC(options)};

}

function createRequest(data, options)
{

    return http.request(options, function (res) {
            var responseString = "";

            res.on("data", function (data) {
                responseString += data;
                // save all the data from response
            });
            res.on("end", function () {
                console.log("AAA" + responseString); 
            });
        });
}



function addtoIMC(options)
{
    return new Promise(function(resolve, reject) {
            var req = createRequest("Hello",options);
            var reqBody = "post_data";
            req.write(reqBody);
            req.end();

        });
}
Run Code Online (Sandbox Code Playgroud)

mar*_*mes 6

您的请求逻辑有点破碎.例如,你的承诺永远不会被解决,你也不会听正确的回调.

我建议你改用request-promise.以下应该有效

const request = require('request-promise');

function main(params) {
    return request({
        url: "http://myhost.mybluemix.net/addtoimc",
        method: "POST",
        headers: {
            "Content-Type": "text/plain"
        }
    }).then(response => {
        if(response.success) {
            return Promise.resolved({message: "nice"});
        } else {
            return Promise.rejected({error: "it broke"});
        }
    });
}
Run Code Online (Sandbox Code Playgroud)