用下划线地图做一些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不。 无论使用all
function还是可以用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); }