Javascript 一个承诺对应多个承诺-并发问题

Javascript 一个承诺对应多个承诺-并发问题,javascript,node.js,npm,gulp,Javascript,Node.js,Npm,Gulp,在“gulpfile.js”的方法“myMethod”中,我想创建多个承诺。数量取决于数组大小(方法参数)。当我调用该方法时,我希望在继续之前确保所有承诺都已兑现。我宁愿在所有的承诺兑现之前不要回来 请查看最后五行代码。 依赖关系 var promiseAll = require('gulp-all'); var del = require('del'); var deleteEmpty = require('delete-empty'); || 辅助方法 var oneForAllPromi

在“gulpfile.js”的方法“myMethod”中,我想创建多个承诺。数量取决于数组大小(方法参数)。当我调用该方法时,我希望在继续之前确保所有承诺都已兑现。我宁愿在所有的承诺兑现之前不要回来

请查看最后五行代码。

依赖关系

var promiseAll = require('gulp-all');
var del = require('del');
var deleteEmpty = require('delete-empty');
||

辅助方法

var oneForAllPromises = function(promises){
    var promAll = promiseAll(promises);
    promAll.then(function(param) {
        console.log('foo');
    }, function(err) {
        console.error('foo');
    });
    return promAll;
}
问题代码

var myMethod = function(array1, array2){
    var promise = del(array1, {force: true});
    promise.then(paths => {console.log('foo');});

    var promises = [];
    promise.then(()=>{
        for(var i=0; i<array2.length; i++){
            promises[i] = new Promise(function(resolve, reject) {
                deleteEmpty(array2[i], {force: true},
                    function(err, deleted){
                        if(err){
                            console.log('foo');
                            reject
                        }else{
                            console.log('foo');
                            resolve
                        }
                    }
                );
            });
        }
    });

    // PROBLEM: Returns empty promises array
    console.log("promiesesLENGTH: "+promises.length); // promiesesLENGTH: 0

    // Create one promise for all the promises
    return oneForAllPromises(promises);
}
var myMethod=函数(array1,array2){
var promise=del(array1,{force:true});
然后(路径=>{console.log('foo');});
var承诺=[];
答应。然后(()=>{

对于console.log时的(var i=0;i),第一个承诺
promise=del(array1,{force:true});
尚未完成,因此
then
中的所有代码都尚未执行。这就是为什么您的承诺是空的

您可以简单地在一个或另一个承诺中返回:

var myMethod = function(array1, array2){
    var promise = del(array1, {force: true});

    return promise.then(() => {
        return Promise.all(array2.map(array2value => {
            return new Promise(function(resolve, reject) {
                deleteEmpty(array2value, {force: true}, (err, deleted) => {
                    if (err) {
                        reject(err);
                    } else{
                        resolve()
                    }
                });
            });
        }
    });
}

在使用console.log时,第一个承诺
promise=del(array1,{force:true});
尚未完成,因此
then
中的所有代码都尚未执行。这就是您的承诺为空的原因

您可以简单地在一个或另一个承诺中返回:

var myMethod = function(array1, array2){
    var promise = del(array1, {force: true});

    return promise.then(() => {
        return Promise.all(array2.map(array2value => {
            return new Promise(function(resolve, reject) {
                deleteEmpty(array2value, {force: true}, (err, deleted) => {
                    if (err) {
                        reject(err);
                    } else{
                        resolve()
                    }
                });
            });
        }
    });
}

是什么触发了承诺的启动?传递给承诺的
然后
的函数在承诺的异步操作完成时被调用,并且永远不会被同步调用。您似乎对异步是如何工作的感到困惑。下面是关于该主题的一个很好的指南:“then”一词是这里语言的一部分,不是代码的参考。很抱歉造成混淆。代码中关键字“then”的含义应该很清楚。但是为什么要写“第一个承诺…尚未开始”?我以为它是在写入位置启动的,但在使用数组长度执行控制台日志时肯定没有完成。谢谢您的指导。是的,它确实启动了,但没有完成。很抱歉,是什么触发了启动承诺?传递给承诺的
的函数在promise的异步操作完成了,并且永远不会被同步调用。您似乎对异步的工作原理感到困惑。下面是一个很好的主题指南:“then”一词是语言的一部分,而不是代码的引用。很抱歉,混淆了。关键字“then”是什么代码中的意思应该是清楚的。但是为什么要写“第一个承诺…还没有开始”?我以为它是从写的位置开始的,但在使用数组长度执行控制台日志时肯定没有完成。谢谢你的指导。是的,它确实开始了,但没有完成。很抱歉误导你