承诺不在Node JS中工作

时间:2017-11-04 17:31:58

标签: node.js loops asynchronous callback promise

我正在尝试使用promises运行异步代码。这里的问题是甚至在回调完成执行之前就会调用响应。

注意:我在循环中编写了一个回调函数。我必须在循环结束后打印一个数组。但是在循环终止之前打印数组。

My question is :
1) Is it correct to use a callback within a loop?
2)If not,then what are the other methods of repeating a callback function.

代码如下:

 router.post('/run',function(req,res){


    var code=req.body.code;
    var lang=req.body.lang;
    var input=req.body.input;
    var result=[];
    switch(lang){
        case 1:
    calculate(code,input).then(function(res){
                console.log(res);
        });
    } 
 });



 function calculate(code,input){
    var result=[]
return new Promise((resolve,reject)=>{
    for(let i=0;i<input.length;i++){

   compile_run.runPython(code, input[i], function (stdout, stderr, err) {
       if(!err){
               console.log(stdout);
               result.push(stdout);
        }
        else{
           console.log(err);

        }


    });
   }
    resolve(result);
})
}

正如我之前所说,case语句中的语句console.log(res)正在打印'[]'。

请帮忙!

提前致谢!

1 个答案:

答案 0 :(得分:1)

compile_run.runPython()是一个异步操作,你循环并多次调用它。这意味着您需要等到每个完成。简单地将整个循环包装在Promise中是不行的(正如您所见),因为您在所有单独的异步操作返回之前解析了承诺。

要使其工作,您需要为每个异步操作创建一个承诺。 Promise.all()可以通过获取一系列承诺来帮助它们,并在所有承诺完成后返回。

我不熟悉compile_run所以我没有运行它,但它应该给你一个很好的起点:

function calculate(code,input){
    var promiseArray = input.map(inp => {
        return new Promise((resolve, reject) => {
            compile_run.runPython(code, inp, function (stdout, stderr, err) {
                if(!err){
                    console.log(stdout);
                    resolve(stdout);
                }
                else{
                    reject(err)
                }
            })
        })
    })
    return Promise.all(promiseArray)
}

promiseArray将是一个承诺数组 - 每次循环一次。一旦所有结果都包含所有结果,Promise.all将解析。您应该可以使用:

calculate(code,input)
.then(result => {
    // use results here
})
.catch(err => console.log(err))