微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-带下划线.find()的Q许诺

我试图在Q承诺的上下文中使用_.find().

我的问题似乎是因为我的谓词函数包含对异步(节点样式)函数调用.

这是我的代码

var IsAlreadyQueued = function() {
    return Q.ninvoke(kueSearcher, 'delayed')
        .then(function(ids) {
            return Q(_.find(ids, function(id) {
                // return true; // This works
                kue.Job.get(id, function(err, job) {
                    if (job.type === 'jobtype') {
                        return true;
                    }
                });

            }));
        });
};

因此,正如我在代码注释中所说的那样,如果我确实返回true;而不是调用kue.Job.get().

您能看到我在诺言中使用_.find()有什么问题吗?

非常感谢你的帮助.

解决方法:

不,您不能将_.find或任何其他同步迭代方法与异步回调一起使用-要么为doesn’t work with filter,要么为doesn’t work with filter.您当前尝试使用return from an asynchronous callback,但无法正常工作.

您首先需要编写一个异步查找功能

function find(arr, predicate, i) {
    i = i >>> 0;
    if (i >= arr.length)
        return Q.resolve(null);
    return predicate(arr[i], i).then(function(m) {
        return m ? arr[i] : find(arr, predicate, i+1);
    });
}

那么您可以重写自己的方法

function isAlreadyQueued() {
    return Q.ninvoke(kueSearcher, 'delayed')
    .then(function(ids) {
        return find(ids, function(id) {
            return Q.npost(kue.Job, "get", id)
            .then(function(job) { return job.type === 'jobtype'; });
        });
    });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐