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'; });
});
});
}
标签:q,promise,underscore-js,find,javascript 来源: https://codeday.me/bug/20191120/2045802.html