Cordova SQLite插件承诺javascript链
Cordova SQLite plugin promises javascript chain
大家好,所以我试图在一次迭代中调用 3 个承诺,然后在它们完成后再次迭代并再次调用它们。谁能帮我解决这个问题?
for(i=0;i<$scope.CurrentES.Issues.length;i++){
app.Logger($scope.CurrentES.Issues[i])
var promiseEvidence = $cordovaSQLite.execute(db, queryEvidence, [$scope.CurrentES.Issues[i].Evidence.Id]).then(function(result){
app.Logger(result.rows.item(0).ImageID);
app.Logger(result.rows.item(0).SupportingDocumetID);
app.Logger(result.rows.item(0).QuoteID);
var promiseImageLib = $cordovaSQLite.execute(db, queryImgLib, [result.rows.item(0).ImageID]).then(
function (r) {
if (r.rows.length != 0) {
var img = r.rows.item(0);
issue.Evidence.ImageLibary.Id = img.id;
issue.Evidence.ImageLibary.ServerID = img.ServerID;
issue.Evidence.ImageLibary.Conclude = img.Conclusion;
issue.Evidence.ImageLibary.ImageTitle = img.Title;
issue.Evidence.ImageLibary.Image = img.Image;
}
}, function (e) {
app.Logger(e);
});
var promiseSupp = $cordovaSQLite.execute(db, querySupp, [result.rows.item(0).SupportingDocumetID]).then(
function (r) {
if (r.rows.length != 0) {
var sup = r.rows.item(0);
issue.Evidence.SupportingDocument.Id = sup.id;
issue.Evidence.SupportingDocument.ServerID = sup.ServerID;
issue.Evidence.SupportingDocument.Link = sup.Link;
issue.Evidence.SupportingDocument.Title = sup.Title;
issue.Evidence.SupportingDocument.Quoatation = sup.Extract;
}
}, function (e) {
app.Logger(e);
});
var promiseQuote = $cordovaSQLite.execute(db, quesryQuote, [result.rows.item(0).QuoteID]).then(
function (r) {
if (r.rows.length != 0) {
var quot = r.rows.item(0);
issue.Evidence.Quote.Id = quot.id;
issue.Evidence.Quote.ServerID = quot.ServerID;
issue.Evidence.Quote.Quoatation = quot.QuoteLegend;
issue.Evidence.Quote.Attributed = quot.QuoteText;
}
}, function (e) {
app.Logger(e);
});
$q.all([promiseImageLib,promiseSupp,promiseQuote]).then(function(r){
})
});
var isDone = $q.all([promiseEvidence]).then(function(r){
})
}
考虑这个问题的一个好方法是,你的承诺链的构建与它们的执行无关。一旦你建立了这种心智模型,就很容易推理了。
让我们将其分解为多个步骤,并从那里构建我们的代码。
执行异步代码并允许操作在完成后发生:
function doSomeAsyncWork(){
var promise1 = foo();
var promise2 = bar();
var promise3 = blah();
return $q.all([promise1, promise2, promise3]);
}
重复此代码 N 次,但按顺序。运行第一次迭代后。
function doWorkNTimes(n) {
var lastPromise;
for (var i = 0; i < n; i++) {
//After initial promise, keep
// chaining them together
if (lastPromise) {
lastPromise = lastPromise.then(function(items) {
return doStuffAsync(i);
});
} else {
lastPromise = doStuffAsync(i);
}
}
return lastPromise;
};
这是一个稍微复杂一些的工作示例,但应该说明这一点。
(function() {
'use strict';
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
function promiseController($q, $timeout) {
var vm = this;
vm.results = [];
vm.numTimes = 3;
vm.isBusy = false;
vm.isDone = true;
vm.doWork = function(times) {
vm.results.splice(0);
vm.isBusy = true;
vm.isDone = false;
doWorkNTimes(vm.numTimes || 1)
.finally(function() {
vm.isBusy = false;
vm.isDone = true;
});
};
function doWorkNTimes(n) {
var lastPromise;
for (var i = 0; i < n; i++) {
(function(i) {
if (lastPromise) {
lastPromise = lastPromise.then(function(items) {
return doStuffAsync(i);
});
} else {
lastPromise = doStuffAsync(i);
}
lastPromise.then(function(items) {
//console.log(items);
vm.results.push(items);
});
}(i));
}
return lastPromise;
};
function doStuffAsync(i) {
var prom1 = createPromise(i),
prom2 = createPromise(i),
prom3 = createPromise(i);
return $q.all([prom1, prom2, prom3]);
}
function createPromise(i) {
var timeout = getRandomInt(200, 2000);
return $timeout(function() {
var item = {
iteration: i,
executionTime: timeout
};
//console.log(item);
return item;
}, timeout);
}
}
angular.module('promise-sample', [])
.controller('promiseController', promiseController);
}());
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.4/angular.min.js"></script>
<div class="container" ng-app="promise-sample" ng-controller="promiseController as ctrl">
<div class="row">
<div class="col-xs-6">
<div class="form-group">
<label>Number of Iterations</label>
<input type="number" class="form-control" min="0" max="10" ng-model="ctrl.numTimes" />
</div>
<div class="form-group">
<button type="button" class="btn btn-primary" ng-click="ctrl.doWork()">Run {{ctrl.numTimes}} Times</button>
</div>
</div>
<div class="col-xs-6">
<table class="table table-striped" ng-repeat="set in ctrl.results">
<thead>
<tr>
<th>Run</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in set">
<td>{{::item.iteration}}</td>
<td>{{::item.executionTime}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
相关文章:
- JavaScript承诺-无法读取属性'那么'的未定义
- JavaScript承诺的定义以及与事件的区别
- 当链接javascript承诺时,如何处理then()函数中的条件
- 对javascript承诺的后备支持
- 同步 Javascript 承诺超时以加班 Google 地理编码查询限制
- 执行一系列 Javascript 承诺一个接一个地解决
- 如何在恢复函数之前等待 JavaScript 承诺解析
- 用Javascript承诺包装同步代码有什么好处吗
- javascript承诺在循环中或如何逐个调用函数
- Javascript承诺:then()'s是't同步
- Javascript承诺-检索结果
- JavaScript承诺使用Mongoose
- javascript承诺和未来类似于C++
- Javascript承诺并更新变量
- Javascript承诺动态回调
- 具有JavaScript承诺的多个函数
- Javascript承诺:它们能在用户空间代码中完全实现吗
- 如何链接javascript承诺和错误
- Javascript-承诺保留为挂起状态
- 以处理错误的方式启动javascript承诺蓝鸟链