【问题标题】:One Promise for Multiple Promises - Concurrency Issue多个 Promise 的一个 Promise - 并发问题
【发布时间】:2016-08-24 00:48:58
【问题描述】:

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

请看最后五行代码。

依赖关系

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

gulp-all | del | 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);
}

【问题讨论】:

    标签: javascript node.js npm gulp


    【解决方案1】:

    在console.log的时候,第一个promisepromise = 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()
                        }
                    });
                });
            }
        });
    }
    

    【讨论】:

    • 什么会触发承诺开始呢?
    • 传递给 promise 的 then 的函数在 promise 的异步操作完成时被调用,并且不会永远被同步调用。您似乎对异步的工作原理感到困惑。这是关于该主题的一个很好的指南:github.com/getify/You-Dont-Know-JS/tree/master/…
    • “then”一词在这里是语言的一部分,而不是对代码的引用。对困惑感到抱歉。代码中关键字“then”的含义应该很清楚。但是为什么要写“第一个承诺......尚未开始”?我认为它是从写入的位置开始的,但是在使用数组长度执行控制台日志时肯定没有完成。感谢您的指导。
    • 是的,它确实已启动但尚未完成。很抱歉误导你
    猜你喜欢
    • 2016-09-10
    • 2018-01-24
    • 2019-06-29
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2020-12-08
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多