我在创建/理解承诺方面遇到了麻烦。我了解其优点并了解如何使用它们。创建自己的承诺功能是困难的部分。简单地说,如何将此函数转换为使用promises:
ret.getDataByGame = function (gameID, playerID) {
var cb = new callbackHelper();
models.gameData.find( { }, function (err, found) {
if (err) {
console.log("error in getting gamedata for gameID: "+gameID);
cb.setData(void 0);
} else {
cb.setData(found);
}
});
return cb;
};
function callbackHelper() {
var self = this;
this.data = false;
this.setData = function (data) {
self.data = data;
};
你用什么框架或香草来向我展示这个例子并不重要。
答案 0 :(得分:1)
ret.getGameDataByGame = lib.promisify(models.gameData.find);
可能就够了。或者使用专用的节点式回调辅助函数:
ret.getGameDataByGame = function(gameID, playerID) {
return lib.ninvoke(models.gameData, "find", {…});
};
对于Q库,请查看其文档的Adapting Node section。
为了使用您用于callbackHelper
事物的模式创建承诺,您的承诺库通常会提供 Deferreds 。你会像这样使用它们:
ret.getDataByGame = function (gameID, playerID) {
var def = new lib.Deferred();
models.gameData.find({…}, function (err, found) {
if (err) {
def.reject("error in getting gamedata for gameID: "+gameID);
} else {
def.fulfill(found);
}
});
return def.promise;
};
另请参阅Q文档中的The Beginning section。
答案 1 :(得分:1)
为了给第二个输入,我快速查看了Q docs的promise实现,但这是我使用的实现,默认情况下支持在浏览器中(IE除外)。关于您发布的算法:
//define promise structure for callback function of interest
ret.getDataByGame = function(gameID, playerID){
return new Promise(function(resolve,reject)
{
try
{
//do any callback function etc. which you want to do
models.gameData.find({},function(err, found){
if(err)
{
console.log("error in getting gamedata for gameID: "+gameID);
reject(err); //if there is error, save as reject
}
else
resolve(found); //if have solution, save as resolve
}
}
catch(exc)
{reject('Error exc gameData.find: '+exc.message);}
}); //end of Promise
}
然后你把你的班级职能等称为:
//where you physically call the function you defined as a promise function
ret.getDataByGame('input1','input2').then(function(output){
alert("woohoo, you are awesome!, output = "+output);
},function(error){
alert("Output error:\r\n"+error);
});
以下是我认为是“标准”的承诺的定义和实现,浏览器支持版本为:Promise doc + tutorial。如果你为大量数据做这件事很酷,而且它们是异步的,你真的可以优化你的执行时间!如:
//repeat promise function
function repeatPromise(inputDataArray)
{
for(var i = 0; i < inputDataArray.length; i++)
{
//where you physically call the function you defined as a promise function
ret.getDataByGame(inputDataArray[i].input1,inputDataArray[i].input2).then(function(resolve){
alert("Output is in async, output = "+resolve);
},function(error){
alert("Output error:\r\n"+error);
});
} //end of for loop
} //end of function
希望这会有所帮助:)