基本的 $q 链示例
是的,你可以使用 Angular 的 $q! 构建一个链式队列!这是一个示例,向您展示如何使用递归来创建任意长度的队列。每个帖子都是连续发生的(一个接一个)。在第一个帖子完成之前,第二个帖子不会开始。
这在写入数据库时会很有帮助。如果数据库后端没有自己的队列,而你同时进行多次写入,你可能会发现你的数据并没有全部保存!
我添加了一个Plunkr example 来演示此代码的运行情况。
$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();
};
您可以使用一个简单的函数来开始您的队列。为了演示,我将一个充满键的对象传递给一个函数,该函数将这些键拆分为单独的帖子,然后将它们发布到Henry's HTTP Post Dumping Server。 (感谢Henry!)
$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);
});
};
如果您想试用此代码,这里是指向Plunkr example 的链接。