保持每 2.5 秒调用一次 API 并在达到预期结果后关闭调用
Keep calling an API every 2.5 seconds and close the call once desired result is achieved
我有一个 API 每 2.5 秒调用一次。最初,响应对象中的数据为空,因为数据库仍在通过事务更新它。但是在随后的第 3 次或第 4 次尝试中,我得到了数据。我正在为此编写一个可重用的函数,但是我没有定义。我的目标是继续调用 API 直到我在我的路径中获得值并关闭连接。请指教
P.S:下面的APIURL没有延迟,我的API有。
const getData = (url, path) => {
const interval = setInterval(async () => {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
return result[path]
}
}, 2500)
return clearInterval(interval)
}
getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion')
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
请指教
你
return clearInterval(interval); // undefined
如果你想return一个在数据可用时解析的Promise,你可以这样做:
const getData = (url, path) => {
return new Promise((resolve, reject) => {
const interval = setInterval(async() => {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
clearInterval(interval); // Clear the interval
resolve(result.data[path]); // Resolve with the data
}
}, 2500);
});
}
getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion')
.then(data => {
console.log(data); // Your data is available here
});
// OR
(async () => {
const version = await getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion');
console.log(version);
})();
这是因为 javascript 是异步的,因为上面的评论已经提到了。您可以在 javascript 中使用回调或承诺。这是代码:
const getData = (url, path, cb) => {
const interval = setInterval(async () => {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
clearInterval(interval); //We found it remove the interval
cb(result.data[path]);
}
}, 2500);
};
getData(
"https://api.oceandrivers.com/static/resources.json",
"swaggerVersion",
data => {
console.log("test",data);
}
);
这里是fiddle:https://jsfiddle.net/7pc4hq6t/3/
您可以创建异步延迟:
const delay = milliseconds => new Promise(resolve, setTimeout(resolve, milliseconds));
然后像这样使用:
const getDataAsync = async (url, path) => {
while (true) {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
return result.data[path];
}
await delay(2500);
}
}
const data = await getDataAsync('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion');
这避免了多层嵌套回调,并生成更易读的代码。
我有一个 API 每 2.5 秒调用一次。最初,响应对象中的数据为空,因为数据库仍在通过事务更新它。但是在随后的第 3 次或第 4 次尝试中,我得到了数据。我正在为此编写一个可重用的函数,但是我没有定义。我的目标是继续调用 API 直到我在我的路径中获得值并关闭连接。请指教
P.S:下面的APIURL没有延迟,我的API有。
const getData = (url, path) => {
const interval = setInterval(async () => {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
return result[path]
}
}, 2500)
return clearInterval(interval)
}
getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion')
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
请指教
你
return clearInterval(interval); // undefined
如果你想return一个在数据可用时解析的Promise,你可以这样做:
const getData = (url, path) => {
return new Promise((resolve, reject) => {
const interval = setInterval(async() => {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
clearInterval(interval); // Clear the interval
resolve(result.data[path]); // Resolve with the data
}
}, 2500);
});
}
getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion')
.then(data => {
console.log(data); // Your data is available here
});
// OR
(async () => {
const version = await getData('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion');
console.log(version);
})();
这是因为 javascript 是异步的,因为上面的评论已经提到了。您可以在 javascript 中使用回调或承诺。这是代码:
const getData = (url, path, cb) => {
const interval = setInterval(async () => {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
clearInterval(interval); //We found it remove the interval
cb(result.data[path]);
}
}, 2500);
};
getData(
"https://api.oceandrivers.com/static/resources.json",
"swaggerVersion",
data => {
console.log("test",data);
}
);
这里是fiddle:https://jsfiddle.net/7pc4hq6t/3/
您可以创建异步延迟:
const delay = milliseconds => new Promise(resolve, setTimeout(resolve, milliseconds));
然后像这样使用:
const getDataAsync = async (url, path) => {
while (true) {
const result = await axios.get(url);
if (_.has(result.data, path) && result.data[path]) {
return result.data[path];
}
await delay(2500);
}
}
const data = await getDataAsync('https://api.oceandrivers.com/static/resources.json', 'swaggerVersion');
这避免了多层嵌套回调,并生成更易读的代码。