Ibm cloud 如何在bluemix上的openwhisk平台中调用openwhisk操作?

Ibm cloud 如何在bluemix上的openwhisk平台中调用openwhisk操作?,ibm-cloud,openwhisk,Ibm Cloud,Openwhisk,我在Bluemix上的OpenWhisk上创建了两个操作。当我可以从OpenWhisk平台外部调用它们时,这两种方法都可以独立工作。但我想从action2中调用action1,并使用以下语法: var openwhisk = require('openwhisk'); function main(args){ const name = 'action2'; const blocking = true; const params = { param1: 'sthing'}; var

我在Bluemix上的OpenWhisk上创建了两个操作。当我可以从OpenWhisk平台外部调用它们时,这两种方法都可以独立工作。但我想从action2中调用action1,并使用以下语法:

var openwhisk = require('openwhisk');
function main(args){
  const name = 'action2';
  const blocking = true;
  const params = { param1: 'sthing'};
  var ow = openwhisk();
  ow.actions.invoke({name, blocking, params})
  .then(result => {
    console.log('result: ', result);
    return result; // ?
  }).catch(err => {
    console.error('failed to invoke actions', err);
  });
}
但我得到一个空结果,没有控制台消息。帮点忙就好了

更新1:

按照建议添加退货选项时,退回OpenWhisk的承诺,如下所示:

return ow.actions.invoke({name, blocking, params})
.then(result => {
  console.log('result: ', result);
  return result;
}).catch(err => {
  console.error('failed to invoke actions', err);
  throw err;
});
action2的响应值不符合预期,但包含:

{ "isFulfilled": false, "isRejected": false }
我期望action2的返回消息(读取Google Sheets API)并解析结果:

{
  "duration": 139,
  "name": "getEventCfps",
  "subject": "me@email.com",
  ...
  "response": {
    "result": {
      "message": [
        {
          "location": "Atlanta, GA",
          "url": "https://werise.tech/",
          "event": "We RISE Women in Tech Conference",
          "cfp-deadline": "3/31/2017",
          ...
        }
      ]
    },
    "success": true,
    "status": "success"
  },
  ...
}
因此,我希望我没有正确解析action1中的“.then(result)”变量?因为当我单独测试action2时,从OpenWhisk外部通过Postman或API Connect,或直接通过OpenWhisk/Bluemix中的“运行此操作”,它会返回正确的值

更新2:


好的,解决了。我在action1中调用的函数中调用了ow.actions.invoke到action2,返回的嵌套导致了问题。当我直接在主函数中移动调用代码时,所有问题都按预期解决了。嵌套promises和returns时出现了双重问题。这是罪过。谢谢大家。您需要返回一个在你的功能中承诺试试这个

var openwhisk = require('openwhisk');
function main(args){
  const name = '/whisk.system/utils/echo';
  const blocking = true;
  const params = { param1: 'sthing'};
  var ow = openwhisk();

  return ow.actions.invoke({name, blocking, params})
  .then(result => {
    console.log('result: ', result);
    return result;
  }).catch(err => {
    console.error('failed to invoke actions', err);
    throw err;
  });
}

您需要在函数中返回一个承诺尝试以下操作

var openwhisk = require('openwhisk');
function main(args){
  const name = '/whisk.system/utils/echo';
  const blocking = true;
  const params = { param1: 'sthing'};
  var ow = openwhisk();

  return ow.actions.invoke({name, blocking, params})
  .then(result => {
    console.log('result: ', result);
    return result;
  }).catch(err => {
    console.error('failed to invoke actions', err);
    throw err;
  });
}

如果您只想调用该操作:

var openwhisk = require('openwhisk');
function main(args) {

  var ow = openwhisk();
  const name = args.action;
  const blocking = false
  const result = false
  const params = args;

  ow.actions.invoke({
    name,
    blocking,
    result,
    params
  });

  return {
    statusCode: 200,
    body: 'Action ' + name + ' invoked successfully'
  };
}
如果要等待调用操作的结果,请执行以下操作:

var openwhisk = require('openwhisk');
function main(args) {

  var ow = openwhisk();
  const name = args.action;
  const blocking = false
  const result = false
  const params = args;

  return ow.actions.invoke({
    name,
    blocking,
    result,
    params
  }).then(function (res) {
        return {
           statusCode: 200,
            body: res
        };
    });
}

如果您只想调用该操作:

var openwhisk = require('openwhisk');
function main(args) {

  var ow = openwhisk();
  const name = args.action;
  const blocking = false
  const result = false
  const params = args;

  ow.actions.invoke({
    name,
    blocking,
    result,
    params
  });

  return {
    statusCode: 200,
    body: 'Action ' + name + ' invoked successfully'
  };
}
如果要等待调用操作的结果,请执行以下操作:

var openwhisk = require('openwhisk');
function main(args) {

  var ow = openwhisk();
  const name = args.action;
  const blocking = false
  const result = false
  const params = args;

  return ow.actions.invoke({
    name,
    blocking,
    result,
    params
  }).then(function (res) {
        return {
           statusCode: 200,
            body: res
        };
    });
}

请注意,
openwhisk
已经返回了一个承诺,因此创建一个新的承诺是多余的。您只需
返回ow.actions.invoke(…)
文档不太清楚它是actionName还是name,或者这两个名称中的任何一个都可以使用。因此,我以前确实尝试过这个方法,当我现在这样做时,它会返回'something',但我不理解返回值,所以我很困惑,'result'响应值是{“IsCompleted”:false,“isRejected”:false},而我期望类似这样的结果{“duration”:139,“name”:“getEventCfps”,“subject”:me@email.com,“版本”:“0.0.27”,“响应”:{“结果”:{“消息”:[{“位置”:“佐治亚州亚特兰大”,投射响应:
result.response.result
投射响应”是什么意思?请注意,
openwhisk
已经返回了一个承诺,因此创建一个新的承诺是多余的。您只需
返回ow.actions.invoke(…)
文档不太清楚它是actionName还是name,或者这两个名称中的任何一个都可以使用。因此,我以前确实尝试过这个方法,当我现在这样做时,它会返回'something',但我不理解返回值,所以我很困惑,'result'响应值是{“IsCompleted”:false,“isRejected”:false},而我期望类似这样的结果{“duration”:139,“name”:“getEventCfps”,“subject”:me@email.com“,”版本“:”0.0.27“,”响应“:{”结果“:{”消息“:[{”位置“:”佐治亚州亚特兰大”,投射响应:
result.response.result
投射响应”是什么意思?