Javascript Node.js承诺不等待循环返回数据

Javascript Node.js承诺不等待循环返回数据,javascript,node.js,for-loop,promise,Javascript,Node.js,For Loop,Promise,return Promise.all([photoArray])返回一个空数组,似乎没有等待callFB返回其承诺,然后将其推入数组 我不确定我做错了什么,但我对for循环和Ifs的承诺比较陌生 我不确定我是否使用了正确数量的承诺,但我似乎无法获得第三层承诺。所有这些都是为了等待for循环实际完成(在这种情况下,for循环必须查看许多项,因此这会导致一个问题,即它不会触发调用反馈,以获取上下文之前应该执行的所有项。完成()被叫 我也尝试过使用Q.all来实现Promise.all([photoA

return Promise.all([photoArray])返回一个空数组,似乎没有等待callFB返回其承诺,然后将其推入数组

我不确定我做错了什么,但我对for循环和Ifs的承诺比较陌生

我不确定我是否使用了正确数量的承诺,但我似乎无法获得第三层承诺。所有这些都是为了等待for循环实际完成(在这种情况下,for循环必须查看许多项,因此这会导致一个问题,即它不会触发调用反馈,以获取上下文之前应该执行的所有项。完成()被叫

我也尝试过使用Q.all来实现Promise.all([photoArray]),但一直无法实现

module.exports = function (context, myBlob) {
                var res = myBlob
                var promiseResolved = checkPhoto(res,context);
                var promiseResolved2 = checkVideo(res,context); 


            Promise.all([promiseResolved, promiseResolved2]).then(function(results){
            context.log(results[0], results[1]);
 //           context.done();
            });


        });  
    };
};

function checkPhoto(res, context){
    return new Promise((resolve, reject) => {
    if (res.photos.length > 0) {
        var photoArray = [];
        for (var j = 0; j < res.photos.length; j++) {
            if (res.photos[j].feedbackId !== null){
                var feedbackId = res.photos[j].feedbackId;
                var callFB = callFeedback(context, feedbackId);                    
                Promise.all([callFB]).then(function(results){
                    photoArray.push(results[0]);
                 });        
            } else {    
                photoArray.push("Photo " + j + " has no feedback");
            }

        }

        return Promise.all([photoArray]).then(function(results){
            context.log("end results: " + results);
            resolve(photoArray);
        });
    } else {
        resolve('No photos');
    }

})
}
function checkVideo(res, context){
        return new Promise((resolve, reject) => {
            same as checkPhoto
    })
    }
function callFeedback(context, feedbackId) {
        return new Promise((resolve, reject) => {

        var requestUrl = url.parse( URL );

            var requestBody = {
                "id": feedbackId
            };

            // send message to httptrigger to message bot
            var body = JSON.stringify( requestBody );

            const requestOptions = {
            standard
            };

            var request = https.request(requestOptions, function(res) {
                var data ="";
                res.on('data', function (chunk) {
                    data += chunk
    //                context.log('Data: ' + data)
                });
                res.on('end', function () {
                resolve("callFeedback: " + true);
                })
            }).on('error', function(error) {
            });
            request.write(body);
            request.end();
            })

}
module.exports=函数(上下文,myBlob){
var res=myBlob
var promiseResolved=检查照片(分辨率、上下文);
var promiseResolved2=检查视频(分辨率、上下文);
所有([promisersolved,promisersolved2])。然后(函数(结果){
log(结果[0],结果[1]);
//context.done();
});
});  
};
};
功能检查照片(分辨率、上下文){
返回新承诺((解决、拒绝)=>{
如果(res.photos.length>0){
var photoArray=[];
对于(var j=0;j{
和checkPhoto一样
})
}
函数调用反馈(上下文,反馈ID){
返回新承诺((解决、拒绝)=>{
var requestUrl=url.parse(url);
var requestBody={
“id”:反馈id
};
//将消息发送到httptrigger到消息bot
var body=JSON.stringify(requestBody);
常量请求选项={
标准
};
var request=https.request(requestOptions,function(res){
var数据=”;
res.on('data',函数(块){
数据+=块
//log('Data:'+Data)
});
res.on('end',function(){
解决(“呼叫反馈:+true”);
})
}).on('error',函数(error){
});
请求书(正文);
request.end();
})
}
代码受到影响。如果已经有了承诺(
promise.all(…)
),就不需要创建新的承诺

错误行为是由
Promise造成的。所有(…)。然后(…)
Promise没有链接。错误不会被处理,
photoArray.push(结果[0])
导致争用条件,因为它的计算晚于
Promise.all([photoArray])…

如果事情应该并行处理:

function checkPhoto(res, context){
    if (res.photos.length > 0) {
        var photoArray = [];
        for (var j = 0; j < res.photos.length; j++) {
            if (res.photos[j].feedbackId !== null){
                var feedbackId = res.photos[j].feedbackId;
                var callFB = callFeedback(context, feedbackId);
                // likely no need to wait for callFB result
                // and no need for Promise.all
                photoArray.push(callFB);
            } else {    
                photoArray.push("Photo " + j + " has no feedback");
            }
        }

        return Promise.all(photoArray); // not [photoArray]
    } else {
        return 'No photos';
    };
}

添加
try..catch
以品尝味道。

您是正确的,for循环在执行下一步之前不会等待任何异步操作完成。到
Promise.all([photoArray])时
被调用,
photoArray
很可能是空的。感谢您的回复-为什么我不必等待callFB结果?我添加了一个澄清。因为这违背了承诺的目的。所有。它应该处理照片的承诺(我想callFB就是这样的)并行。等待每一个结果以串行方式处理它们,并使循环变慢。@AnonymousDownvoter在没有任何反馈的情况下批量对问题和现有答案进行向下投票总是很有帮助的。谢谢你让这里变得更好。我仍然有点困惑-我很高兴for循环迭代中的承诺能够并行运行lel,我只是不想让它触发Promise.all([photoArray]),直到每个循环都完成(到完成时,它已经从callFB回调并推送到数组)-这是因为构造反模式而阻止的吗?并行运行-它们并行运行,失去控制。您得到了竞争条件。我只是不希望它触发承诺。全部([photoArray])在每个循环完成之前,您需要async/await,正如我最初建议的那样,这样做很容易。但您不需要async/await,因为这些承诺互不依赖,因此可以并行处理。为什么要使用Promise.all?如果您等待循环中的所有承诺都得到解决,这是没有意义的。
async function checkPhoto(res, context){
    if (res.photos.length > 0) {
        var photoArray = [];
        for (var j = 0; j < res.photos.length; j++) {
            if (res.photos[j].feedbackId !== null){
                var feedbackId = res.photos[j].feedbackId;
                const callFBResult = await callFeedback(context, feedbackId);
                // no need for Promise.all
                photoArray.push(callFBResult);
            } else {    
                photoArray.push("Photo " + j + " has no feedback");
            }
        }

        return photoArray; // no need for Promise.all, the array contains results
    } else {
        return 'No photos';
    };
}