Q promise 带下划线 .find()
Q promise with underscore .find()
我试图在 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;
}
});
}));
});
};
因此,正如我在代码的评论中所说,如果我 return true;
而不是调用 kue.Job.get()
它会起作用。
你能看出我在 promise 中使用 _.find() 有什么问题吗?
非常感谢您的帮助。
不,您不能使用 _.find
或任何其他带有异步回调的同步迭代方法 - 它 doesn't work with filter
either. You currently try to 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'; });
});
});
}
我不知何故让它与这个一起工作:
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;
});
});
};
有人可以验证我上面的解决方案吗?谢谢!
我试图在 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;
}
});
}));
});
};
因此,正如我在代码的评论中所说,如果我 return true;
而不是调用 kue.Job.get()
它会起作用。
你能看出我在 promise 中使用 _.find() 有什么问题吗?
非常感谢您的帮助。
不,您不能使用 _.find
或任何其他带有异步回调的同步迭代方法 - 它 doesn't work with filter
either. You currently try to 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'; });
});
});
}
我不知何故让它与这个一起工作:
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;
});
});
};
有人可以验证我上面的解决方案吗?谢谢!