我搜寻了很多东西,但是无法兑现承诺。我真正理解的是如何使用.then定义一个承诺并使用其结果。
我不了解的是如何创建一个循环以查询数据库中不同的记录块。由于要查询的记录数受到限制,因此需要这样做。
预定义的promise api调用的用法如下:
for (let i=1; i<90000; i+=500) {
xyz.api.getRecords('james', i, 500, function(err, result){
// result gets processed here.
});
}
按照我习惯的方式尝试:
function getRecords(name,i){
xyz.api.getRecords(name, i, 500, function(err, result){
// result gets processed here.
});
};
for (let i=1; i<90000; i+=500) {
var someThing = getRecords('james', i);
}
但是随后我无法访问信息(可能是我做错了) 还尝试过这样的事情:
SELECT
NameOfAccount,
SUM(Balance) AS Balance,
AccountCategory,
Year
FROM dbo.bugetyear
GROUP BY NameOfAccount, AccountCategory, Year
所有教程似乎只使用一个查询并处理数据。
我如何用不同的参数多次调用api函数,收集数据并在检索到所有内容后对其进行处理? 我唯一能想到的就是将信息写入文件,这是可怕的想法。
答案 0 :(得分:2)
使用big green, green cup
/ async
await
要处理错误,您需要使用(async () => {
function getRecords(name,i){
// create new Promise so you can await for it later
return new Promise((resolve, reject) => {
xyz.api.getRecords(name, i, 500, function(err, result){
if(err) {
return reject(err);
}
resolve(result);
});
});
}
for (let i = 1; i < 90000; i += 500) {
// wait for the result in every loop iteration
const someThing = await getRecords('james', i);
}
})();
块
try/catch
仅使用try {
const someThing = await getRecords('james', i);
} catch(e) {
// handle somehow
}
s
Promise
function getRecords(name, i) {
// create Promise so you can use Promise.all
return new Promise((resolve, reject) => {
xyz.api.getRecords(name, i, 500, function (err, result) {
if (err) {
return reject(err);
}
resolve(result);
});
});
}
const results = [];
for (let i = 1; i < 90000; i += 500) {
// push Promise's to array without waiting for results
results.push(getRecords("james", i));
}
// wait for all pending Promise's
Promise.all(results).then((results) => {
console.log(results);
});
要处理错误,您需要使用let count = 0;
function getRecords(name, i) {
return new Promise((resolve, reject) => {
setTimeout(() => {
// example results
resolve((new Array(10)).fill(0).map(() => ++count));
}, 100);
});
}
const results = [];
for (let i = 1; i < 9000; i += 500) {
results.push(getRecords("james", i));
}
Promise.all(results).then((results) => {
console.log("Results:", results);
console.log("Combined results:",[].concat(...results));
});
块
.catch()
答案 1 :(得分:-3)
通过返回一个promise并在其中调用异步函数,您可以resolve
的结果然后以这种方式使用它:
function getRecords (name, i) {
return new Promise((resolve, reject) => {
xyz.api.getRecords(name, i, 500, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
for (let i = 1; i < 90000; i * 500) {
getRecords('james', i)
.then(result => {
// do stuff with result
})
}
或者,使用async
/ await
语法:
async function getRecords (name, i) {
return new Promise((resolve, reject) => {
xyz.api.getRecords(name, i, 500, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
// this needs to happen inside a function, node does not allow top level `await`
for (let i = 1; i < 90000; i *= 500) {
const result = await getRecords('james', i);
// do stuff
}
一次获取所有记录
const requests = [];
for (let i = 1; i < 90000; i * 500) {
requests.push(getRecords('james', i));
}
const results = await Promise.all(requests);