如何在angular js中同步函数命令



我正在创建一个离子应用程序,尤其是在特定的场景中当从列表(从JSON数据数组生成)中选择一名员工时,他的详细信息将从这里显示

var employees=[{"id":325,"firstName":"James","lastName":"King"、"managerId":0、"manager Name":"、"reports":4、"title":"总裁兼首席执行官"、"部门":"公司"、"手机":"617-000-0001","办公电话":"781-000-0001,"电子邮件":"jking@gmail.com","城市":"马萨诸塞州波士顿","图片":"詹姆斯金.jpg","twitterId":"@fakejking","博客":"http://coenraets.org"}……

我所需要的只是找到ID的索引来显示完整的对象。

     findById: function(employeeId) {
                var deferred = $q.defer();
                var searchValue = {'id': employeeId };
                index = -1;
                _.each(employees, function(data, idx) { 
                if (_.isEqual(data, searchValue)) {
                index = idx;
                return;
                }
                });
                var employee = employees[index];
                deferred.resolve(employee);
                return deferred.promise;
            },

为此,我使用的是这个函数,它不在_内部使用调试器。每个函数

请告诉我我错在哪里了。

它不会起作用,因为表达式_.isEqual(employees[xxx], {id: 325})永远不会返回匹配项。

相反,使用_.find方法

findById: function(employeeId) {
    var employee = _.find(employees, {id: employeeId});
    return $q.when(employee);
}

我认为您可以稍微简化您的函数,因为您使用的是lodash:

findById: funtion(employeeId) {
    return _.findWhere(employees, {id : employeeId});
}

此外,我看不出有任何理由在这里使用承诺,但为了遵循这个概念,你可以尝试一下:

findById: funtion(employeeId) {
    var deferred = $q.defer();
    $timeout(function() {
        var employee = _.findWhere(employees, {id : employeeId});
        if (found !== undefined) {
            deferred.resolve(employee);
        } else {
            deferred.reject();
    }, 0);
    return deferred.promise;
}

您需要在resolve()reject()之前返回promise deferred.promise,这样您就可以在被调用者中等待它。

希望能有所帮助!

我不知道你是否真的需要索引。制定一个解决方案,在找到数据的那一刻返回员工,会更好、更短。你也应该跳出循环。

如果您的调试器没有在_内部跳转,则可能您的employees数组为空。你可以试试这样的东西:

       findById: function(employeeId) {
            var deferred = $q.defer();  
            // deferred should be inside the scope of _.each
            // because it is defined here
            var searchValue = {'id': employeeId };
            //index = -1;
            // check your data here
            // for example console.log(employees.length)
            // or make a breakpoint here and check employees
            _.each(employees, function(data, idx) { 
            // make a console.log(idx) here to check your data
            if (_.isEqual(data, searchValue)) {
              deferred.resolve(data);
              return deferred.promise;;
            }
            });
        },

最新更新