我试图用对象解析一个数组,但该数组只返回一个值。 scrapeModule返回一个文本值数组。这是代码:
"use strict";
var scrapeModule = require("./scrape");
const accounts = function(promiseObj, link) {
// Update the url-value in promiseObj
promiseObj.url = promiseObj.url.replace(config.url.substring(19), JSON.parse(link));
return scrapeModel(promiseObj).then((arrayContainingText) => {
let arrayIWantToSend = []
arrayContainingText.forEach(function(nameHTML) {
fetchObj(promiseObj, name).then(function(data) {
arrayIWantToSend.push(data)
return data;
console.log(data) =>
[ { key1: 'v1', key2: 'v2', key3: 'v3'},
{ key1: 'v1', key2: 'v2', key3: 'v3'},
{ key1: 'v1', key2: 'v2', key3: 'v3'} ]
})
});
};
const fetchObj = function(promiseObj, link) {
let keyValues = {};
// Clone the old promiseObj
let thObj = JSON.parse(JSON.stringify(promiseObj));
let tdObj = JSON.parse(JSON.stringify(promiseObj));
// Replace the track-values
thObj.track = "th";
tdObj.track = "td";
return Promise.all([scrapeModule((thObj)), scrapeModule((tdObj))]).then(data => {
let key = data[0];
let v = data[1];
for (let i = 0; i < data.length; i++) {
for (let y = 0; y < data[i].length; y++) {
keyValues[key[y]] = data[y];
}
}
return keyValues
});
};
module.exports = accounts;
我使用此代码在另一个模块中记录promise的结果。我希望函数返回的值是带有值的数组:
accounts(url, link)
.then(function(data) {
console.log(data)
}); -- > //[ undefined ]
但是当我在console.log&#34;数据&#34;在accounts()中的Promise中,数组返回:
[ { key1: 'v1', key2: 'v2', key3: 'v3'},
{ key1: 'v1', key2: 'v2', key3: 'v3'},
{ key1: 'v1', key2: 'v2', key3: 'v3'} ]
有什么建议吗?
答案 0 :(得分:1)
考虑到您使用let
,您的代码可以大大简化,然后我也添加了其他ES6“功能”
var scrapeModule = require("./scrape");
const accounts = function(promiseObj, link) {
// Update the url-value in promiseObj
promiseObj.url = promiseObj.url.replace(config.url.substring(19), JSON.parse(link));
return scrapeModel(promiseObj)
.then(arrayContainingText =>
Promise.all(arrayContainingText.map(nameHTML =>
fetchObj(promiseObj, name)
))
);
};
const fetchObj = ... // no changes
module.exports = accounts;
我没有对fetchObj
做任何更改,因为现在该函数看起来很奇怪,因为它需要一个它永远不会使用的参数link
,嵌套的看起来也是错误的 - 怀疑它应该{ {1}} - 但你知道的更好,因为你可以运行代码并对其进行调试
答案 1 :(得分:0)
这是一个简单的迭代问题。循环不适用于Promises,所以我创建了一个包含多个promise的数组并将它们发送到Promise.all
return scrapeModel(promiseObj).then((arrayContainingText) => {
var promises = [];
data.forEach(function(name) {
promises.push(fetchObj(promiseObj, name))
});
return Promise.all(promises).then(function(data) {
return data;
}).catch(function(e) {console.log(e)});
});
};