Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺条件相等_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 承诺条件相等

Javascript 承诺条件相等,javascript,node.js,promise,Javascript,Node.js,Promise,我想在代码中等待,直到两个值相同。为此,我使用 await new Promise((resolve, reject) => { if(curCount == maxTests) resolve; }); 但我想,这只叫一次。如果两个值相同,我如何使承诺得到解决?如何避免它永远不会发送解决方案 更新: 有些人要求提供制造麻烦的功能。这是整个函数,没有它的子函数。该函数将填充q队列以填充同步测试。问题是req.body.selection.forEach立即

我想在代码中等待,直到两个值相同。为此,我使用

    await new Promise((resolve, reject) => {
        if(curCount == maxTests) resolve;
    });
但我想,这只叫一次。如果两个值相同,我如何使承诺得到解决?如何避免它永远不会发送解决方案

更新: 有些人要求提供制造麻烦的功能。这是整个函数,没有它的子函数。该函数将填充q队列以填充同步测试。问题是req.body.selection.forEach立即返回,但我想等到整个队列准备就绪。所以我的想法是在结尾添加一个承诺,直到current和max相同为止

router.post('/imgtest', async (req, res) => {

    console.log('Start Image Test');

    //Er kommt an.
    req.setTimeout(5000000); // Nach Adam Riese 83 Minuten.
    process.setMaxListeners(0);

    io = req.app.get('socketio');

    //Caluclate the max amounnt of tests
    const maxTests = req.body.selection.length * req.body.servers.length;
    var curCount = 0;


    //RETURN IF THIS IS READY. CURRENTLY IT RETURNS IMMEDIATLY
    req.body.selection.forEach(async function(entry) {

        //Jetzt erstmal die Domain aus der DB holen
        var dbUrl = await getUrl(entry);
        console.log('tapsi');

        var bildFormat = '';

        var arrQuestionmark = dbUrl.split('?');
        if(arrQuestionmark.length==2){
            if(arrQuestionmark[1].includes('&')){
                var arrAnd = arrQuestionmark[1].split('&');
                arrAnd.forEach(function(entry) {
                    if(entry.includes('format=')){
                        var arrFormat = entry.split('=');
                        bildFormat = arrFormat[1];

                    }
                });
            }
        }

        var masterName = uuidv1();
        const orgpath = path.resolve(__basedir, 'tests/downloads', masterName + '-.' + bildFormat);

        //Download the MAsterimage
        (async () => {

            await queue.add(() =>downloadImage(dbUrl, 'c11', req.body.domain,  bildFormat, orgpath) );

        })();

        req.body.servers.forEach(async function(xserver) {

            var fileName = masterName + '-' + xserver + '.' + bildFormat;

            const dpath = path.resolve(__basedir, 'tests/downloads', fileName);

            (async () => {
                await queue.add(() => downloadImage(dbUrl, xserver, req.body.domain, bildFormat, dpath));
                //console.log('Done ' + entry);
            })();

            (async () => {
                await queue.add(async() => startCompare(orgpath, dpath, 'null:').then(function(result) {
                    console.log(result);
                    curCount++;
                    messageIO(curCount,maxTests);
                }));
                //console.log('done compare ' + entry);
                //fs.unlinkSync(dpath);
            })();



        });


    });


    console.log('Need to wait');

    res.sendStatus(200);

});

你认为只调用一次是正确的。一种解决方法是,在函数中,通过setInterval创建一个循环-定期检查并解析是否为true并清除循环。

不太确定尝试实现什么,但有一件事是肯定的,Array.prototype.forEach不会等待,即使其回调是异步的,并且在新的Promise中执行测试。。。构造器帮不上忙

不过,好消息还在后头呢

这里的代码使用for循环而不是.forEach循环两次,删除了不必要的内容,或者进行了整理

首先是一个建议

// https://nodejs.org/api/querystring.html
// The querystring module provides utilities for parsing and formatting URL query strings.
const querystring = require('querystring');
。。。然后:

router.post('/imgtest', async (req, res) => {
    req.setTimeout(5000000); // Nach Adam Riese 83 Minuten.
    process.setMaxListeners(0);
    // io = req.app.get('socketio'); // not used
    const masterName = uuidv1(); // moved from inner loop
    for (i=0; i<req.body.selection.length; i++) {
        let entry = req.body.selection[i];
        let dbUrl = await getUrl(entry);
        let bildFormat = querystring.parse(dbUrl).format;
        let orgpath = path.resolve(__basedir, 'tests/downloads', `${masterName}-.${bildFormat}`);
        await queue.add(() => downloadImage(dbUrl, 'c11', req.body.domain, bildFormat, orgpath));
        for (j=0; j<req.body.servers.length; j++) {
            let xserver = req.body.servers[j];
            let dpath = path.resolve(__basedir, 'tests/downloads', `${masterName}-${xserver}.${bildFormat}`);
            await queue.add(() => downloadImage(dbUrl, xserver, req.body.domain, bildFormat, dpath));
            await queue.add(async() => startCompare(orgpath, dpath, 'null:'); // probably safe to remove `async`
            // fs.unlinkSync(dpath); // ???
        }
    }
    res.sendStatus(200);
});

这应该让你开始。我希望你还有一段路要走。至少您需要添加一个try/catch结构,并准备好将错误/状态发送回客户端。

看起来像这样。你能分享更多关于你试图解决的问题的细节吗?现在,这段代码并没有真正告诉我们确切的问题是什么。您所拥有的不会等到值相等。你是对的,它只运行一次。你能不能再分享一点你想要完成的事情,或者更多的代码?你能不能发布一些代码来说明你是如何修改curCount和maxTests的?我已经添加了要求的信息。希望这能更好地解释我的问题。您应该阅读一些好书或教程,解释wait/async的功能。类似async=>{await queue.add…;}的代码;没有任何意义。您可以在不等待匿名异步函数完成的情况下调用它。在它里面,您有一个等待,它在您的代码中实际上没有任何效果。这相当于只写queue.add;。和req.body.selection.forEachasync functionentry{也是没有任何意义的。请使用for…of循环或带有Promise.all的.mapasync functionentry{。