Q承诺下划线.find()

时间:2015-02-25 20:34:51

标签: javascript find underscore.js promise q

我试图在Q promise的上下文中使用_.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;
                    }
                });

            }));
        });
};

正如我在代码中的评论中所说,如果我执行return true;而不是调用kue.Job.get(),那就可以了。

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

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

不,您不能将_.find或任何其他同步迭代方法与异步回调一起使用 - 它也是doesn't work with filter。您目前正在尝试return from an asynchronous callback,这只是不起作用。

您首先需要编写异步find函数:

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'; });
        });
    });
}

答案 1 :(得分:1)

不知怎的,我用它做到了:

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

有人可以验证我的解决方案吗?谢谢!