gpt4 book ai didi

javascript - 从非异步调用异步/等待函数并添加值返回未定义

转载 作者:行者123 更新时间:2023-11-28 03:08:45 24 4
gpt4 key购买 nike

我是异步函数的新手。我正在尝试将其应用于 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;
}

当通过decideWho调用func1时,它返回结果并执行addStamp,以便将日期添加到返回值中。

但是当调用 func2 时,它会正确返回值,但是从decideWho 来看,addStamp 在返回之前不会执行,因此“日期”未定义。在本次事件中,我必须在返回值时在 func2 中调用 addStamp。

如何避免这种未定义的情况?

我确信我搞砸了 async/await。

我尝试通过使用await声明额外的值来将async/await放入decideWho中,然后用addStamp将其包装,然后返回它。

let result = await eval(obj[choice]||obj[default]);
return addStamp(result);
}

但是,当客户端使用 google.script.run 调用decideWho 时,它会抛出未定义的错误。我想我需要在某个地方再添加一次等待,但我找不到在哪里。

有几点值得一提(*因为客户端的表单调用各种函数,所以我决定将一堆放入一个桶中。即无论选项如何,它只会从客户端调用服务器函数的decideWho,并通过选项的值,它将选择哪个函数将每个函数都会从decideWho返回值和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()})

感谢乔什和安迪

最佳答案

我认为这应该适合你。它还有其他几个重构...

在我看来,基本问题是,当您将异步函数添加到对象时,您并没有等待它们。

// use const - variables are unreliable!
// Rest Spread syntax
const addStamp = obj => ({
...obj,
date: new Date();
})

// this can throw on a network or JSON parse error,
// the fn that calls (and awaits / .then chains)
// on decideWho needs to handle that.
const decideWho = async form => {
const { choice } = form;
// you need to await these, they are async
const obj = {
key1 : await func1(form.input1),
key2 : await func2(form.input2)
};
return addStamp(eval(obj[choice]||obj[default]));
}

// can throw from network or JSON parse
const fetchUrl = async (url, params) => {
let data = await UrlFetchApp.fetch(url,params).getContentText();
return JSON.parse(data);
}

const func1 = async val => {
const params = {...};
let response = await fetchUrl(val, params);
return response["message"];
}

const func2 = async val => {
const params = {...};
const response = await UrlFetch.app(val, params);
// use a ternary, and no intermediate var
return (response.getResponseCode() === 200) ?
{step:"file", result:response} :
{step: null, result: ""};
}
}

关于javascript - 从非异步调用异步/等待函数并添加值返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60353523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com