所以我过去几天一直在玩承诺,只是试图转换一些项目,使用承诺,但我已经多次修复这个问题.
在阅读文章和教程时,一切看起来都很流畅:
getDataFromDB()
.then(makeCalculatons)
.then(getDataFromDB)
.then(serveToClient)
Run Code Online (Sandbox Code Playgroud)
但实际上,它不是那样的.
程序有很多"if conditions"改变整个流程:
getDataFromCache(data).then(function(result){
if(result){
return result;
}else{
return getDataFromDB();
}
}).then(function(result){
if(result){
serveToClient() //this does not return a promise, so undefined returned...
}else{
return getDataFromWebService(); //this does return a promise,
}
}).then(function(result){
//i dont want to reach here if i already serveToClient()...
//so i basically have to check "if(result)" for all next thens
if(result){
//do more stuff
}
}).then(...
Run Code Online (Sandbox Code Playgroud)
我有两个主要问题:
if在then回调中添加了很多条件.then回调,即使我已经完成了(serveToClient)
我是否遵循了正确的模式?
所以我试图将我的代码转移到"Promise world",并且在很多地方,当我不得不"循环"异步功能时 - 我只是以这种方式使用递归
function doRecursion(idx,callback){
if(idx < someArray.length){
doAsync(function(){
doRecursion(++idx,callback)
});
}else{
callback('done!')
}
}
doRecursion(0,function(msg){
//...
});
Run Code Online (Sandbox Code Playgroud)
现在我正试图改变进入Promise世界,我很困惑
var Promise = require('bluebird')
function doRecursion(idx){
return new Promise(function(resolve){
if(idx < someArray.length){
doAsync(function(){
//... doRecursion(++idx)
// how do i call doRecusion here....
});
}else{
resolve('done!')
}
});
}
doRecursion(0).then(function(msg){
//...
});
Run Code Online (Sandbox Code Playgroud)
谢谢.
我最近了解了window.parent.postMessage的HTML 5 API,并且想知道使用该代码与简单的ajax调用有什么优缺点,
例如,在客户端上为e.origin ==='www.example.com'创建一个消息事件的侦听器,并在www.example.com上创建一个包含以下内容的页面:
window.parent.postMessage(data,'*');
Run Code Online (Sandbox Code Playgroud)