谁可以在循环中向PHP程序员解释Node.js承诺

时间:2018-09-14 15:45:31

标签: javascript node.js

我搜寻了很多东西,但是无法兑现承诺。我真正理解的是如何使用.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函数,收集数据并在检索到所有内容后对其进行处理? 我唯一能想到的就是将信息写入文件,这是可怕的想法。

2 个答案:

答案 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);