使用下划线地图执行异步操作

时间:2016-06-27 12:50:37

标签: node.js promise underscore.js q

function addSomething(data) {
    var defer = q.defer();
    data = _.map(data, function(item) {
            item['something'] = callSomethingAsync();
            return item;
    });
    return defer.promise;
}

我该如何处理这个问题。我找到的唯一方法是使用Async.js。 但也许有更好的方法使用$ q?

编辑:

function getScopes(item) {
    var defer = q.defer();
    var query = "SELECT somevalue FROM Something WHERE ID = '" + item.id + "'";
    mysql.query(query, function(err, data) {
        if (err) {
            defer.reject(err);
        } else {
            item[newkey] = data
            defer.resolve(item);
        }
    });
    defer.resolve(data)
    return defer.promise;
}

//add necessary scopes to the audit
function addScopes(data) {
    var promises = _.map(data, function(item) {
        return getScopes(item);
    });
    return Promise.all(promises);
}

如何防止在getScopes函数中使用defer?

编辑2:

var query = "SELECT * FROM tiscope";
Q.nfcall(mysql.query, query).then(function(data) {
        console.log(data);
});

没有任何回报。

以下是我如何使用mysql:

var sql = require('mysql');

var connection = sql.createConnection({
    host     : 'xxx',
    user     : 'xxx',
    password : 'xxx',
    database : 'xxx'
});

connection.connect(function(err) {
    if (err) {
        console.error('error connecting: ' + err.stack);
    } else {
        console.log('mysql connection established');
    }
});

module.exports = connection;

也许有错误。

1 个答案:

答案 0 :(得分:3)

许多promise库提供map函数。似乎Q没有。无论如何,使用all函数无论如何都可以用vanilla promises(和Q)完成。

首先要做的事情。避免使用defer。它使代码更难以推理和维护。只有极少数情况下需要推迟。其余的时间正常的promise构造函数/帮助函数将更好地工作。

正常承诺示例

function addSomething() {
  var promises = _.map(data, function(item) {
    return callSomethingAsync(item);
  });
  return Promise.all(promises);
}

Q Promises示例

function addSomething() {
  var promises = _.map(data, function(item) {
    return callSomethingAsync(item);
  });
  return $q.all(promises);
}

据推测,callSomethingAsync会返回一个承诺。如果不使用promise构造函数模式:

function toPromise(asyncFn, args) {
  return new Promise(function (resolve, reject) {
    function callback(err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    }
    asyncFn(callback, args);
  });
}

function addSomething() {
  var promises = _.map(data, function(item) {
    return toPromise(callSomethingAsync, item);
  });
  return Promise.all(promises);
}