我正在写一个依赖承诺的angularjs应用程序,虽然它正在工作,但我想知道我是否可以更优化地做到这一点.
在代码的开头,我正在创建一个获取一些数据的承诺.完成后,我想运行几个都使用这些数据的函数.这些函数附加在应用程序的不相关部分,因此我不知道它们附加到承诺的顺序.它们也不需要按顺序完成.
app.service("Fetch", function ($q){
return function() {
var def = $q.defer();
somelibrary.asynccall(function(error, data){ //callback
if (error) def.reject(error);
else def.resolve(data);
});
return def.promise;
};
});
app.controller("ctrl", function ($scope, Fetch) {
var prom = Fetch();
//somewhere:
prom.then(function(data){$scope.var1 = data["VAR1"];});
//somewhere else:
prom.then(function(data){$scope.var2 = data["VAR2"]});
});
Run Code Online (Sandbox Code Playgroud)
这里的主要缺点是后者then只在前面的那些完成时执行,这在此不是必需的.
另外,我需要return data在每个内部添加function(data){...},否则以下then()没有data可用.
有没有其他方法可以做到这一点,更适合这种情况?
编辑:正如@jfriend00所提到的,我错了; 事实上,只要成功解决了承诺,这两个函数就会并行运行,并且它们不会被链接,因此不会相互依赖.谢谢你的帮助
所以我过去几天一直在玩承诺,只是试图转换一些项目,使用承诺,但我已经多次修复这个问题.
在阅读文章和教程时,一切看起来都很流畅:
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)
我是否遵循了正确的模式?
我一直遇到javascript承诺的几个问题,特别是堆叠链.
谁能向我解释这些不同实现之间的差异(如果有的话)?
实施1
var serverSidePromiseChain;
serverSidePromiseChain = async().then(function(response) {
console.log('1', response);
return response;
}).then(function(response) {
console.log('2', response);
return true;
}).then(function(response) {
console.log('3', response); // response expected to be 'true'
return async3();
}).then(function(response) {
console.log('4', response);
return async4();
})
Run Code Online (Sandbox Code Playgroud)
实施2
var serverSidePromiseChain;
serverSidePromiseChain = async().then(function(response) {
console.log('1', response);
return response;
});
serverSidePromiseChain.then(function(response) {
console.log('2', response);
return true;
})
serverSidePromiseChain.then(function(response) {
console.log('3', response); // response expected to be 'true'
return async3();
})
serverSidePromiseChain.then(function(response) {
console.log('4', response);
return async4();
})
Run Code Online (Sandbox Code Playgroud)
实施3
var serverSidePromiseChain; …Run Code Online (Sandbox Code Playgroud) 当我对单个 Promise 对象有多个 thenable 函数时,它会起作用吗?在这种情况下我不想嵌套。我想对同一个承诺对象执行不同的操作。
var a = 0,
t = null,
promiseFun = function () {
return new Ext.Promise(function (resolve, reject) {
t = setInterval(function () {
if (a == 1) {
resolve();
clearInterval(t);
} else if (a == 2) {
reject();
clearInterval(t);
}
}, 1000);
})
};
var promiseObj = promiseFun();
//handler one
promiseObj.then(function () {
console.log('resolved 1')
}, function () {
console.log('rejected 1')
}).then(function () {
console.log('resolved Nest')
}, function () {
console.log('rejected Nest')
});
//handler two- …Run Code Online (Sandbox Code Playgroud) 我希望以下代码段的输出是1, 2, 3, 4.但是,实际的输出顺序是1, 4, 3, 2.
self.promiseChain = new Promise(function (resolve, reject) {
setTimeout(resolve, 4000);
}).then(function () {
console.log(1);
});
self.promiseChain.then(function () {
return new Promise(function (resolve, reject) {
setTimeout(resolve, 3000);
}).then(function () {
console.log(2);
});
});
self.promiseChain.then(function () {
return new Promise(function (resolve, reject) {
setTimeout(resolve, 2000);
}).then(function () {
console.log(3);
});
});
self.promiseChain.then(function () {
return new Promise(function (resolve, reject) {
setTimeout(resolve, 200);
}).then(function () {
console.log(4);
});
});
Run Code Online (Sandbox Code Playgroud)
http://www.es6fiddle.net/imu5bhoj/
我所读到的关于承诺的一切表明应该可以在这样的"扁平"链中获得所需的订单.显然我错过了一些细节?有人能指点我正确的方向吗?