我正在使用the 'Q' library为了 promise 。
这是场景:
var results = dbContext.query(userCert.conn, dbQuery.BuildQuery(query));
var models = [];
if (!results.hasErr) {
for (var r in results.okPacket.results) {
var m = new model(results.okPacket.results[r]);
models.push(m);
}
}
userCert.conn.end(); // close db connection
在dbContext.query(...)
中:
var $Q = require('Q');
function execQuery(connection, query) {
console.log("[backend][context] EXEC QUERY: " + query);
$Q.nfcall(connection.query, query)
.then(function (err, results) {
var ret = {};
if (err) {
// log
var errPkt = getErrPacket(err);
console.log("QUERY ERROR[" + errPkt.errCode + ": " +
errPkt.errConst + "]: " + errPkt.errMessage);
ret = {
hasErr: true,
errPacket: errPkt
};
} else {
ret = {
hasErr: false,
okPacket: {
resType: results.constructor.name,
resLength: results.length,
results: results
}
};
}
// is this correct?
return function () {
return ret;
};
})
.then(function (ret) {
// how do I then return ret to the caller?
})
.done();
}
我只是在执行此操作的过程中有点迷失(如果可能的话)。回调在我的应用程序的较低级别中是可以的,但我不想最终得到一盘充满回调意大利面的菜。
最佳答案
使用 promise ,您只需将 promise 返回给调用者即可:
function execQuery(connection, query) {
console.log("[backend][context] EXEC QUERY: " + query);
return $Q.nfcall(connection.query, query)
.then(function(results) {
return {
hasErr: false,
okPacket: {
resType: results.constructor.name,
resLength: results.length,
results: results
}
};
})
.catch(function(err) {
// This doesn't necessarily mean a database error because
// all errors are caught here
if (false /*
TODO logic that checks if the err is not a database error
in which case you should just rethrow
*/) {
throw err;
}
var errPkt = getErrPacket(err);
console.log("QUERY ERROR[" + errPkt.errCode + ": " +
errPkt.errConst + "]: " + errPkt.errMessage);
return {
hasErr: true,
errPacket: errPkt
};
});
}
调用者可以只使用返回的 promise :
dbContext.query(userCert.conn, dbQuery.BuildQuery(query))
.then(function(results) {
// It is really weird to have to check for error in the success
// case but whatever floats your boat
if (!results.hasErr) {
var models = results.okPacket.results.map(function(result) {
return new model(result);
});
}
})
.finally(function() {
userCert.conn.end();
})
.done();
关于javascript - 正确使用 Promise 返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182052/