javascript - 为什么 Zapier SetTimeout 功能不起作用?
问题描述
我正在使用 Zapier 代码 (Javascript) 调用第 3 方 API 来转换货币。每次我点击 Zap,它都会进行大约 40 次 API 调用。
在我通过 Zapier 的输出变量将值发送到下一步之前,我正在使用 setTimeout 延迟并确保值可用并且 API 调用已完成,但似乎它们被忽略了......整个 zapier 动作执行在 384 毫秒内。
我与 Zapier 交谈并被告知他们确实支持 setTimeout。我究竟做错了什么?我想不明白... :)
**在下面的答案中更新
//This code runs API calls for all Amount, OOP and GM currency conversions.
//* Note - Timeout is used to allow the API calls to finish and ensure those results are set and available before setting the final Zapier output values.
var fromAmt;
var fromOOP;
var fromGM;
var fromCur = inputData.currency;
//set input values from Zapier and replace with "0" if null
if (inputData.amount == null){fromAmt = 0;}
if (inputData.outofpocket == null){fromOOP = 0;}
if (inputData.gm == null){fromGM = 0;}
var toCur = ["USD", "EUR", "INR", "GBP", "SGD", "AUD", "CNY", "HKD", "ARS", "AED", "MXN", "NZD", "BRL", "CAD", "SEK", "COP"];
var dAmt = {"USD":10,"EUR":0,"INR":0,"GBP":0,"SGD":0,"AUD":0, "CNY":0, "HKD":0, "ARS":0, "AED":0, "MXN":0, "NZD":0, "BRL":0, "CAD":0, "SEK":0, "COP":0};
var dOOP = {"USD":0,"EUR":0,"INR":0,"GBP":0,"SGD":0,"AUD":0, "CNY":0, "HKD":0, "ARS":0, "AED":0, "MXN":0, "NZD":0, "BRL":0, "CAD":0, "SEK":0, "COP":0};
var dGM = {"USD":0,"EUR":0,"INR":0,"GBP":0,"SGD":0,"AUD":0, "CNY":0, "HKD":0, "ARS":0, "AED":0, "MXN":0, "NZD":0, "BRL":0, "CAD":0, "SEK":0, "COP":0};
output = [{amtUSD: 0,
amtEUR: 0,
amtINR: 0,
amtGBP: 0,
amtSGD: 0,
amtAUD: 0,
amtCNY: 0,
amtHKD: 0,
amtARS: 0,
amtAED: 0,
amtMXN: 0,
amtNZD: 0,
amtBRL: 0,
amtCAD: 0,
amtSEK: 0,
amtCOP: 0,
oopUSD: 0,
oopEUR: 0,
oopINR: 0,
oopGBP: 0,
oopSGD: 0,
oopAUD: 0,
oopCNY: 0,
oopHKD: 0,
oopARS: 0,
oopAED: 0,
oopMXN: 0,
oopNZD: 0,
oopBRL: 0,
oopCAD: 0,
oopSEK: 0,
oopCOP: 0,
gmUSD: 0,
gmEUR: 0,
gmINR: 0,
gmGBP: 0,
gmSGD: 0,
gmAUD: 0,
gmCNY: 0,
gmHKD: 0,
gmARS: 0,
gmAED: 0,
gmMXN: 0,
gmNZD: 0,
gmBRL: 0,
gmCAD: 0,
gmSEK: 0,
gmCOP: 0,}];
function setOutput()
{
output["amtUSD"] = dAmt["USD"];
output["amtEUR"] = dAmt["EUR"];
output["amtINR"] = dAmt["INR"];
output["amtGBP"] = dAmt["GBP"];
output["amtSGD"] = dAmt["SGD"];
output["amtAUD"] = dAmt["AUD"];
output["amtCNY"] = dAmt["CNY"];
output["amtHKD"] = dAmt["HKD"];
output["amtARS"] = dAmt["ARS"];
output["amtAED"] = dAmt["AED"];
output["amtMXN"] = dAmt["MXN"];
output["amtNZD"] = dAmt["NZD"];
output["amtBRL"] = dAmt["BRL"];
output["amtCAD"] = dAmt["CAD"];
output["amtSEK"] = dAmt["SEK"];
output["amtCOP"] = dAmt["COP"];
output["oopUSD"] = dOOP["USD"];
output["oopEUR"] = dOOP["EUR"];
output["oopINR"] = dOOP["INR"];
output["oopGBP"] = dOOP["GBP"];
output["oopSGD"] = dOOP["SGD"];
output["oopAUD"] = dOOP["AUD"];
output["oopCNY"] = dOOP["CNY"];
output["oopHKD"] = dOOP["HKD"];
output["oopARS"] = dOOP["ARS"];
output["oopAED"] = dOOP["AED"];
output["oopMXN"] = dOOP["MXN"];
output["oopNZD"] = dOOP["NZD"];
output["oopBRL"] = dOOP["BRL"];
output["oopCAD"] = dOOP["CAD"];
output["oopSEK"] = dOOP["SEK"];
output["oopCOP"] = dOOP["COP"];
output["gmUSD"] = dGM["USD"];
output["gmEUR"] = dGM["EUR"];
output["gmINR"] = dGM["INR"];
output["gmGBP"] = dGM["GBP"];
output["gmSGD"] = dGM["SGD"];
output["gmAUD"] = dGM["AUD"];
output["gmCNY"] = dGM["CNY"];
output["gmHKD"] = dGM["HKD"];
output["gmARS"] = dGM["ARS"];
output["gmAED"] = dGM["AED"];
output["gmMXN"] = dGM["MXN"];
output["gmNZD"] = dGM["NZD"];
output["gmBRL"] = dGM["BRL"];
output["gmCAD"] = dGM["CAD"];
output["gmSEK"] = dGM["SEK"];
output["gmCOP"] = dGM["COP"];
}
async function getConversionAsync(type, fcur, tcur, amt) {
let response = await fetch('https://data.fixer.io/api/convert?access_key=xxx&from=' + fcur + '&to=' + tcur + '&amount=' + amt);
let data = await response.json();
if (type == "Amount"){
dAmt[tcur] = await parseFloat(data.result.toString()).toFixed(2);
}
else if (type == "OOP"){
dOOP[tcur] = await parseFloat(data.result.toString()).toFixed(2);
}
else if (type == "GM"){
dGM[tcur] = await parseFloat(data.result.toString()).toFixed(2);
}
}
function getConvertedAmounts(fAmt,fOOP,fGM,cur){
var i;
for (i=0; i < toCur.length; i++){
getConversionAsync("Amount", cur,toCur[i],fAmt);
}
for (i=0; i < toCur.length; i++){
getConversionAsync("OOP", cur,toCur[i],fOOP);
}
for (i=0; i < toCur.length; i++){
getConversionAsync("GM", cur,toCur[i],fGM);
}
}
getConvertedAmounts(fromAmt,fromOOP,fromGM,fromCur);
//In Zapier this is where we write the values out to the next function
setTimeout(function(){ setOutput(); }, 5000);
解决方案
几点:
不要使用
setTimeout()
. 您只能猜测超时值。5000 或其他任何值可能太长或太短。允许返回的承诺fetch()
和response.json()
确定时间非常简单——无需猜测。允许您的函数接受参数并返回结果。通过这样做,调用函数可以直接处理返回的值/对象,并且可以避免外部成员,例如
dAmt
,dOOP
,dGM
,fAmt
,fOOP
, ;fGM
大多数会成为内部成员getConvertedAmounts()
。As
getConversionAsync
是异步的,并且callsgetConvertedAmounts()
也是(根据定义)异步的。getConversionAsync()
getConvertedAmounts()
不需要初始化
output
。如果任何调用失败,错误处理getConversionAsync()
可用于设置转换的默认值。fetch()
的人口
output
可以在几行代码中程序化。
你可能会得到这样的结果:
function setOutput(dAmt, dOOP, dGM) {
let output = {};
Object.keys(dAmt).forEach(function(key) {
output["amt" + key] = dAmt[key];
});
Object.keys(dOOP).forEach(function(key) {
output["oop" + key] = dOOP[key];
});
Object.keys(dGM).forEach(function(key) {
output["gm" + key] = dGM[key];
});
return output;
}
async function getConversionAsync(fcur, tcur, amt) {
try {
let response = await fetch(`https://data.fixer.io/api/convert?access_key=xxx&from=${fcur}&to=${tcur}&amount=${amt}`);
let data = await response.json();
return parseFloat(data.result.toString()).toFixed(2);
}
catch(error) {
console.log(error); // optional
return 0; // or maybe return -1 to signify an error?
}
}
async function getConvertedAmounts(inputData) {
let fAmt = inputData.amount || 0;
let fOOP = inputData.outofpocket || 0;
let fGM = inputData.gm || 0;
let cur = inputData.currency;
let toCur = ["USD", "EUR", "INR", "GBP", "SGD", "AUD", "CNY", "HKD", "ARS", "AED", "MXN", "NZD", "BRL", "CAD", "SEK", "COP"];
let dAmt = {};
let dOOP = {};
let dGM = {};
for (const curCode of toCur) {
dAmt[curCode] = await getConversionAsync(cur, curCode, fAmt);
dOOP[curCode] = await getConversionAsync(cur, curCode, fOOP);
dGM[curCode] = await getConversionAsync(cur, curCode, fGM);
}
return setOutput(dAmt, dOOP, dGM);
}
getConvertedAmounts(inputData)
.then(output => {
// do whatever is necessary with output
})
.catch(error => {
// something went wrong
});
推荐阅读
- java - 在 Java 中实现 Cvent WSDL
- c++ - 使用索引与迭代器将向量迭代到倒数第二个元素
- c# - Caliburn Micro,Wpf 绑定嵌套模型
- java - 我自己的 ArrayAdapter 中出现奇怪的 NullPointerException
- machine-learning - 哪个分类器可以根据非轴平行决策边界进行分类?
- angular - 移动项目文件后模态错误
- c - Flex/Bison 启动条件
- javascript - Angular - 查看父组件中的变量变化
- xml - XML Schema 验证错误:以
- database - 使用 mongodb 的聊天应用程序架构