我想做什么:
var found = false;
while (!found){
var result = db.getNextRecord();
if (result == search_term){
return result;
}
}
问题是,getNextRecord是异步的
var nothing_returned = db.getNextRecord(function(err, result){
// I have the result in this callback, but not before
});
鉴于getNextRecord(cb)的行为,我如何重写上面的代码片段以获得相同的结果?
答案 0 :(得分:1)
由于你有一个async
的功能而你想要同步呼叫,你有两个选择。如果有可用的方法,请使用sync
版本的方法,但如果没有,那么您必须更改逻辑。
以下代码段应该可以执行您想要的操作,它需要async库。
var async = require('async');
var result;
async.whilst(
function () {
return !result;
},
function (callback) {
db.getNextRecord(function (err, record) {
if (err)
{
return callback(err);
}
if (result == search_term)
{
result = record;
}
return callback();
});
},
function (err) {
// Search is complete, do what you wish with result in this function. This function
// will be called when whilst is done or if getNextRecord got an error.
}
);
如果您想要更改逻辑,我确定有更短的方法可以做到这一点,但这类似于执行while
但是异步。
答案 1 :(得分:1)
使用async库。它的until
函数看起来就像你需要的那样:https://www.npmjs.com/package/async#until
var async = require('async');
var latestResult = null;
async.until(function () {
return latestResult == search_term;
}, function () {
db.getNextRecord(function (err, result) {
latestResult = result;
});
}, function () {
// now you can do something with latestResult
});
您还应该考虑在您的应用中执行此操作是否有意义,或者让数据库查询包含此过滤。
答案 2 :(得分:0)
使用babel
和新JS:
import {promisify as pr} from 'es6-promisify';
async function find(search_term) {
let found = false, result=null;
while (!found){
let result = await pr(db.getNextRecord)();
if (result == search_term){
found=true;
}
}
return result;
}