代码之家  ›  专栏  ›  技术社区  ›  RST

谁能向PHP程序员解释nodejs在循环中的承诺

  •  1
  • RST  · 技术社区  · 6 年前

    我不明白的是如何创建一个循环来查询数据库中的不同记录块。由于对要查询的记录数设置了限制,因此需要这样做。

    预定义的promise api调用的用法如下:

    let getRecords = (name) => {
      return new Promise((resolve,reject) => {
        xyz.api.getRecords(name, 1000, 1000, function(err, result){
          // result gets processed here.
        resolve(//somevariables here);
        });
    )};
    

    按照我的习惯,我试着:

    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);
    }
    

    如何使用不同的参数多次调用api函数,收集数据并在检索完所有内容后进行处理? 我唯一能想到的是,把信息写进一个文件,可怕的想法。

    2 回复  |  直到 6 年前
        1
  •  2
  •   ponury-kostek    6 年前

    使用 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
    }
    

    仅使用 Promise s

    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()

    Promise.all(results).then((results) => { ... }).catch((error) => {
        // handle somehow
    });
    
        2
  •  -3
  •   bcr    6 年前

    通过返回一个承诺并在其中调用异步函数,您可以 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);