【发布时间】:2020-06-06 18:16:15
【问题描述】:
我是异步函数的新手。我正在尝试将它应用于 UrlFetchApp.fetch。当出现网络问题时,它会抛出未定义的错误,因为没有可用的响应代码。因此,我尝试了异步功能。
var addStamp = obj => {
obj.date = new Date();
return obj;
}
var decideWho = (form) => {
var choice = form.choice;
var obj = { key1 : 'func1(form.input1)',
key2 : 'func2(form.input2)'......};
return addStamp(eval(obj[choice]||obj[default]));
}
const fetchUrl = async (url, params) => {
let data = await UrlFetchApp.fetch(url,params).getContentText();
return JSON.parse(data);
}
var func1 = async (val) => {
var params = {...};
let response = await fetchUrl(val, params);
return response["message"];
}
var func2 = async (val) => {
var params = {...};
let response = await UrlFetch.app(val, params);
if (response.getResponseCode() === 200) {
var result = {step:"file", result:response};
} else var result = {step: null, result: ""};
return result;
}
当通过decisionWho 调用func1 时,它返回结果并执行addStamp,以便将日期添加到返回值中。
但是当 func2 被调用时,它会正确返回值,但是从 decisionWho 中,addStamp 在它返回之前没有执行,所以 'date' 是未定义的。在这个事件中,我必须在 func2 中调用 addStamp,同时返回值。
如何避免这种未定义?
我确定我搞砸了异步/等待。
我试图通过用 await 声明额外的值然后用 addStamp 包装它然后返回它来将 async/await 放入decisionWho。
let result = await eval(obj[choice]||obj[default]);
return addStamp(result);
}
但是,当使用 google.script.run 从客户端调用 decisionWho 时,它会引发未定义的错误。我想在某个地方我需要再添加一次等待,但我不知道在哪里。
值得一提的几点 (*由于客户端的表单调用了各种函数,所以我决定将一堆放在一个桶中。即不管选项如何,它只会从客户端调用服务器函数的decisionWho,并通过选项的值来选择哪个函数将用参数调用。每个函数都从decisionWho返回值和addStamp,这样我就不必在每个函数中重复这个过程/代码。 **只有 func1 和 func2 是异步的,其他的不是。)
成功了
const addStamp = async (obj) => {
const temp = await obj;
temp.date = new Date();
return temp;
}
或更短的版本
const addStamp = async (obj) => (
{ ...(await obj),
date: new Date()})
感谢乔希和安迪
【问题讨论】: