bsr*_*bsr 6 javascript queue angularjs q
我使用mbostock/queue来排队几个异步操作.它更多的是速率限制(UI生成很少的事件,后端可以缓慢地处理它),并且还确保它们按顺序处理.我喜欢它
function request(d, cb) {
//some async oper
add.then(function(){
cb(null, "finished ")
})
}
var addQ = queue(1);
addQ.defer(request) //called by few req at higher rates generated by UI
Run Code Online (Sandbox Code Playgroud)
我已经使用angular.js $ q进行异步操作.所以,我必须使用mbostock/queue,或者我可以建立一个队列$q(这是精神https://github.com/kriskowal/q)
谢谢.
是的,你可以使用 Angular 的 $q 构建链式队列!下面的示例向您展示了如何使用递归来创建任意长度的队列。每个帖子都是连续发生的(一个接一个)。在第一篇文章完成之前,第二篇文章不会开始。
这在写入数据库时很有帮助。如果数据库后端没有自己的队列,并且您同时进行多个写入,您可能会发现并非所有数据都被保存!
我添加了一个Plunkr 示例来演示此代码的实际操作。
$scope.setData = function (data) {
// This array will hold the n-length queue
var promiseStack = [];
// Create a new promise (don't fire it yet)
function newPromise (key, data) {
return function () {
var deferred = $q.defer();
var postData = {};
postData[key] = data;
// Post the the data ($http returns a promise)
$http.post($scope.postPath, postData)
.then(function (response) {
// When the $http promise resolves, we also
// resolve the queued promise that contains it
deferred.resolve(response);
}, function (reason) {
deferred.reject(reason);
});
return deferred.promise;
};
}
// Loop through data creating our queue of promises
for (var key in data) {
promiseStack.push(newPromise(key, data[key]));
}
// Fire the first promise in the queue
var fire = function () {
// If the queue has remaining items...
return promiseStack.length &&
// Remove the first promise from the array
// and execute it
promiseStack.shift()()
// When that promise resolves, fire the next
// promise in our queue
.then(function () {
return fire();
});
};
// Begin the queue
return fire();
};
Run Code Online (Sandbox Code Playgroud)
您可以使用一个简单的函数来开始队列。为了演示,我将一个充满键的对象传递给一个函数,该函数将这些键拆分为单独的帖子,然后将它们 POST 到Henry 的 HTTP Post Dumping Server。(谢谢亨利!)
$scope.beginQueue = function () {
$scope.setData({
a: 0,
b: 1,
/* ... all the other letters of the alphabet ... */
y: 24,
z: 25
}).then(function () {
console.log('Everything was saved!');
}).catch(function (reason) {
console.warn(reason);
});
};
Run Code Online (Sandbox Code Playgroud)
如果您想尝试此代码,这里有一个Plunkr 示例的链接。
| 归档时间: |
|
| 查看次数: |
18070 次 |
| 最近记录: |