$q promise with Underscore _each

◇◆丶佛笑我妖孽 提交于 2019-11-28 02:01:49

You want to use $q.all, which takes an array of promises. So use map instead of each, and pass the result to $q.all(), which gives you a promise that waits for all of them. You don't even need that stuff array which is manually filled, but just can use the resolution value of that new promise.

function processCoolStuff(coolStuffs) {
    return $q.all(_.map(coolStuffs, makeStuffCooler));
}
processCoolStuff(…).then(showAllMyCoolStuff);
$q.all([promise1,promise2,promise3,etc])
.then(function(results){
   alert("This alert will happen after all promises are resolved.");
 })

after I read the question and the according answer, I got on the right track. Thanks so far! But for the final working soltion I spent another hour to get all use cases working. That's why I would like to share a code example which contains chained promises including an array of promises to wait for resolution.

Use case background is a server-side (nodeJs) file import after upload. I used promises in order to return an appropriate http status and result.

readFile: function (fileName) {
    if (fileName) {
        var deferred = Q.defer();
        var self = this;
        converter({input: fileName}, function (error, userData) {
            if (error) {
                deferred.reject(error);
            }
            self.storeUsers(error, userData)
                .then(function (success) {
                    if (success) {
                        deferred.resolve(success)
                    }
                })
                .fail(function (error) {                       
                    deferred.reject(error)                      
                });
        });
        return deferred.promise;
    }
},

storeUsers: function (error, data) {
    return Q.all(_.map(data, function (users, emailAddress) {
        var deferred = Q.defer();
        userRepository.findUserByEmail(emailAddress, function (user) {
            //...
            user.save(function (error) {
                if (error) {
                    deferred.reject(error);
                } else {
                    deferred.resolve(emailAddress);
                }
            });

        });
        return deferred.promise;
    }));
}

Hope that helps too!

Cheers Ben

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!