我在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);
});
}
但是我得到一个空结果而没有控制台消息。一些帮助会很棒。
UPDATE1:
按建议添加返回选项时,返回OpenWhisk的Promise,如下所示:
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表格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"
},
...
}
所以我希望我没有正确解析' .then(action1中的结果'变量?因为我分别测试action2,从OpenWhisk外部通过Postman或API Connect,或直接通过&#39 ;在OpenWhisk / Bluemix中运行此操作,它将返回正确的值。
UPDATE2:
好的解决了。我在一个函数中调用ow.actions.invoke到action2,这个函数在action1中被调用,这个返回的嵌套导致了这个问题。当我直接在main函数中移动调用代码时,所有都按预期解析。嵌套承诺和退货时双重麻烦。 Mea culpa。谢谢大家
答案 0 :(得分:4)
你需要在你的函数中返回一个Promise试试这个
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;
});
}
答案 1 :(得分:0)
如果您只想调用操作:
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
};
});
}