Node.JS内部回调

时间:2015-10-09 17:15:33

标签: javascript node.js

我想做什么:

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)的行为,我如何重写上面的代码片段以获得相同的结果?

3 个答案:

答案 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;
}