异步推送数组中的项目
Push items in array asynchronously
我想将一个对象推入数组,其中一个字段是需要从异步函数获取的值
function loadContentAsync(url) {
var deferred = Q.defer();
request(url, function (err, res, html) {
if (!err) {
deffered.resolve(html);
}
});
return deffered.promise;
}
var aList = $('#mCSB_5_container ul').find('a');
console.log(c);
var list = [];
aList.each(function (i, elem) {
var html = loadContentAsync(this.attribs.href);
list.push({
title: $(this).text(),
url: this.attribs.href,
content: html
});
});
但是当我运行这段代码时,因为loadContentAsync
函数没有同步return值,所以html字段将为空。
如何异步处理这个字段?
您需要等待承诺得到解决。为了保持元素的正确顺序,应该使用Q.all()
累加所有promise的结果:
function loadContentAsync(url) {
var defer = Q.defer();
request(url, function (err, res, html) {
if (err) {
defer.reject(err);
}
else {
defer.resolve(html);
}
});
return defer.promise;
}
var aList = $('#mCSB_5_container ul').find('a');
console.log(c);
var promises = aList.map(function (i, elem) {
return loadContentAsync(this.attribs.href);
}).get();
var list = [];
Q.all(promises).then(function (htmlList) {
htmlList.forEach(function (html) {
list.push({
title: $(this).text(),
url: this.attribs.href,
content: html
});
});
});
我想将一个对象推入数组,其中一个字段是需要从异步函数获取的值
function loadContentAsync(url) {
var deferred = Q.defer();
request(url, function (err, res, html) {
if (!err) {
deffered.resolve(html);
}
});
return deffered.promise;
}
var aList = $('#mCSB_5_container ul').find('a');
console.log(c);
var list = [];
aList.each(function (i, elem) {
var html = loadContentAsync(this.attribs.href);
list.push({
title: $(this).text(),
url: this.attribs.href,
content: html
});
});
但是当我运行这段代码时,因为loadContentAsync
函数没有同步return值,所以html字段将为空。
如何异步处理这个字段?
您需要等待承诺得到解决。为了保持元素的正确顺序,应该使用Q.all()
累加所有promise的结果:
function loadContentAsync(url) {
var defer = Q.defer();
request(url, function (err, res, html) {
if (err) {
defer.reject(err);
}
else {
defer.resolve(html);
}
});
return defer.promise;
}
var aList = $('#mCSB_5_container ul').find('a');
console.log(c);
var promises = aList.map(function (i, elem) {
return loadContentAsync(this.attribs.href);
}).get();
var list = [];
Q.all(promises).then(function (htmlList) {
htmlList.forEach(function (html) {
list.push({
title: $(this).text(),
url: this.attribs.href,
content: html
});
});
});