用下划线地图做一些asynchronous的事情

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函数中使用延迟?

编辑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; 

也许有错误。

许多承诺库提供了一个map函数。 似乎Q不。 无论使用allfunction还是可以用vanilla promise(和Q)来完成。

首先是事情。 避免defer 。 它使代码更难于推理和维护。 只有less数情况下需要延期。 剩下的时间正常承诺构造函数/辅助函数将更好地工作。

正常承诺示例

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

Q承诺的例子

 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); }