回调不是异步echOfSeries中的函数

时间:2018-01-25 12:34:11

标签: javascript asynchronous async.js

这个问题看起来像是我的另一个问题:NodeJS Local variable in callback但我认为它有所不同,因为答案的解决方案在这里不起作用。

我有一个async.eachOfSeries()功能,它会循环来自商店的一些收藏品。根据属性,它将创建一个类别,或者它将尝试获取现有类别。根据该结果:将创建新类别或更新现有类别。 之后,调用异步回调以进一步处理下一个集合。 但是当代码调用回调时,我收到错误collectionsDone is not a function。那个函数是我的回调。 我已根据上述问题的答案使用IIFE进行了尝试,但这似乎不起作用。

我该如何解决这个问题?

    async.eachOfSeries(shop.collections, function(collection, collectionsDone){
        if(!collection.countrId){
            //This collection doesn't seems to be synced to countr yet
            createCategory(collection[language].name, access_token, function(err, category){
                if(category){
                    collection.categoryId = category._id;
                }

                return collectionsDone();
            })
        }else{
            //It looks like that this category is already synced, but maybe we should update it
            var link = 'categories/' + collection.categoryId;
            (function(collectionsDone){
                externalService.callApi({url: link}, null, access_token, function(err, category){
                    console.log("err", err, "category", category);
                    if(err.error == "not_found"){
                        createCategory(collection[language].name, access_token, function(err, category){
                            if(category){
                                collection.categoryId= category._id;
                            }
                            return collectionsDone();
                        })
                    }else{
                        if(category.name != collection[language].name){
                            var data = {
                                _id: category._id,
                                name: collection[language].name,
                                color: category.color,
                                visible: category.visible
                            };
                            var url = 'categories/' + category._id;
                            externalService.callApi({
                                url: url,
                                method: "PATCH"
                            }, data, access_token, function(err, category){
                                return collectionsDone();
                            })
                        }else{
                            return collectionsDone();
                        }
                    }
                })
            })(collectionsDone);
        }
    }, function(){
        //collectionsDone()
        shop.save(function(err, result){
            console.log("shop save", err, result);

            if(err){
                return callback({code: 500, msg: err});
            }
            return callback(null, result);
        })
    })

2 个答案:

答案 0 :(得分:1)

正如async official documentation中所提到的,这里的“collectionsDone”函数纯粹是循环函数内部的,所以它不能与回调中的“return”一起使用。

换句话说,“collectionsDone”只是切换到异步循环的下一次迭代的通用函数。一旦循环终止,就不需要传递它。

答案 1 :(得分:0)

我错过了回调中的密钥,所以它必须是

async.eachOfSeries(shop.collections, function(collection, key, collectionsDone){