Javascript 我是否正确使用此承诺功能
我正在使用node从一个使用cheerio的url获取一些数据Javascript 我是否正确使用此承诺功能,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,我正在使用node从一个使用cheerio的url获取一些数据 const request=require('request'); const cheerio=require('cheerio'); const Promise = require('promise'); 函数getDataParms(parm1,parm2) 返回承诺对象 通过retrieveAllData(parm1,limit) 最终输出来自 var test2 = retrieveAllData('foo','2015'
const request=require('request');
const cheerio=require('cheerio');
const Promise = require('promise');
函数getDataParms(parm1,parm2)
返回承诺对象
通过retrieveAllData(parm1,limit)
最终输出来自
var test2 = retrieveAllData('foo','2015');
console.log(test2);
node script.js的输出
// [ Promise { _75: 0, _83: 0, _18: null, _38: null } ]
在某些地方,我没有正确使用promise方法,我也不知道在哪里。我需要一些有经验的眼睛来帮助我找出我做错了什么
守则:
const request=require('request');
const cheerio=require('cheerio');
const Promise = require('promise');
var dateVal = new Date();
var test2 = [];
function retrieveAllData(parm1, limit){
var output = [];
var intermediate;
for (var j=1; j <= limit; j++){
var objKey = parm1 + "_data";
var results = {
"data1": null,
[objKey]: null
};
results.data1 = j;
objKey = objKey + "_" + j;
results[objKey] = getDataParms(parm1, j).then(function(value){
//console.log(value);
return value;
});
//console.log(results[objKey]);
output.push(results[objKey]);
}
return output;
}
// Returns a Promise array
function getDataParms(parm1, parm2){
var sourceURL = "http://website/source=" + material + "&parm1=" + parm1 + "&parm2=parm2";
var parsedResults = [];
var metadata = {
record_parm2: time_period,
record_no: null,
record_date: null,
col1: null,
col2: null,
col3: null
};
return new Promise(function(fulfill, reject){
request(sourceURL, function(error,response,html){
if (error){
reject(error);
} else if (!error && response.statusCode == 200){
var $ = cheerio.load(html);
$(".data tr").each(function(i, element){
metadata.record_no = i;
$(this).find("td").each(function(cellindex){
switch(cellindex){
case 0:
metadata.record_date = $(this).text();
break;
case 1:
metadata.col1 = parseFloat($(this).text());
break;
case 2:
metadata.col2 = parseFloat($(this).text());
break;
case 3:
metadata.col3 = parseFloat($(this).text());
break;
}
});
parsedResults.push(metadata);
});
fulfill(parsedResults);
}
});
});
}
var test2 = retrieveAllData('foo','2015');
console.log(test2);
const request=require('request');
const cheerio=需要(“cheerio”);
常量承诺=要求(“承诺”);
var dateVal=新日期();
var test2=[];
函数retrieveAllData(parm1,极限){
var输出=[];
var中间值;
对于(var j=1;j因为每个getDataParms
调用都返回一个Promise
,您应该等待所有这样的承诺首先用Promise来解析。all
。另外,因为getDataParms
返回一个Promise
,所以使用getDataParams
的retrieveAllData
也应该返回一个承诺
以便最终的结果
在以后可用。您应该调用retrieveAllData(…
),而不是var test2=retrieveAllData(…
),然后在retrieveAllData
调用中调用
function retrieveAllData(parm1, limit){
// Create an array of Promises, with `j`'s values being 0 to `limit - 1`:
const allPromises = Array.from(
{ length: limit },
(_, j) => {
// Make j start at 1 rather than 0:
j++;
const objKey = parm1 + "_data_" + j;
// After getDataParms resolves, return an object with keys `data1` and `[objKey]`:
return getDataParms(parm1, j)
.then((parms) => ({
data1: j,
[objKey]: parms
}));
}
);
return Promise.all(allPromises);
}
然后用消费它。然后:
retrieveAllData('foo','2015')
.then(test2 => {
console.log(test2);
});
为
循环使用,而不是功能性的,将如下所示:
function retrieveAllData(parm1, limit){
const allPromises = [];
for (let year = 1990; year <= limit; year++) {
const objKey = parm1 + "_data_" + year;
allPromises.push(
getDataParms(parm1, j)
.then((parms) => ({
data1: j,
[objKey]: parms
}))
)
}
return Promise.all(allPromises);
}
函数检索AllData(parm1,限制){
常量allPromises=[];
对于(让年份=1990年;年份)({
数据1:j,
[objKey]:帕尔姆斯
}))
)
}
返回承诺。全部(所有承诺);
}
因为每个getDataParms
调用都返回一个Promise
,所以您应该等待所有这样的承诺首先使用Promise.all
解析。另外,因为getDataParms
返回一个Promise
,所以使用getDataParams
的retrieveAllData
也应该返回一个Promise
以便最终的结果
在以后可用。您应该调用retrieveAllData
而不是var test2=retrieveAllData(…
),然后调用
function retrieveAllData(parm1, limit){
// Create an array of Promises, with `j`'s values being 0 to `limit - 1`:
const allPromises = Array.from(
{ length: limit },
(_, j) => {
// Make j start at 1 rather than 0:
j++;
const objKey = parm1 + "_data_" + j;
// After getDataParms resolves, return an object with keys `data1` and `[objKey]`:
return getDataParms(parm1, j)
.then((parms) => ({
data1: j,
[objKey]: parms
}));
}
);
return Promise.all(allPromises);
}
然后用消费它。然后:
retrieveAllData('foo','2015')
.then(test2 => {
console.log(test2);
});
为
循环使用,而不是功能性的,将如下所示:
function retrieveAllData(parm1, limit){
const allPromises = [];
for (let year = 1990; year <= limit; year++) {
const objKey = parm1 + "_data_" + year;
allPromises.push(
getDataParms(parm1, j)
.then((parms) => ({
data1: j,
[objKey]: parms
}))
)
}
return Promise.all(allPromises);
}
函数检索AllData(parm1,限制){
常量allPromises=[];
对于(让年份=1990年;年份)({
数据1:j,
[objKey]:帕尔姆斯
}))
)
}
返回承诺。全部(所有承诺);
}
您需要使用承诺。在您的情况下,以下示例可能会对您有所帮助
function retrieveAllData(parm1, limit) {
var output = [];
for (var j = 1; j <= limit; j++) {
output.push(getDataParms(parm1, j));
}
return Promise.all(output);
}
var test2 = retrieveAllData('foo', '2015'); // this will return a promise
test2.then(function (result) {
console.log(result);
})
函数检索AllData(parm1,限制){
var输出=[];
对于(var j=1;j您需要使用Promise.all
在您的情况下,以下示例可能会对您有所帮助
function retrieveAllData(parm1, limit) {
var output = [];
for (var j = 1; j <= limit; j++) {
output.push(getDataParms(parm1, j));
}
return Promise.all(output);
}
var test2 = retrieveAllData('foo', '2015'); // this will return a promise
test2.then(function (result) {
console.log(result);
})
函数检索AllData(parm1,限制){
var输出=[];
对于(var j=1;j),他在寻找一个对象数组,比如[{“data1”:null[objKey]:null},…][/code>,而不是一个值数组no。您似乎跳过了我正在使用的代码的整个关键元素。他在寻找一个对象数组,比如[{“data1”:null[objKey]:null},…]
,不是一个值数组否。您似乎跳过了我正在使用的代码的整个关键元素。不,我不是什么?4.8.2不,我不是什么?4.8.2坦克,这是有道理的,但我还不了解函数的胖箭头形式。所以我用另一种方式来做,我现在更了解。在(\uj)中的目的是什么为什么j从1开始而不是从0开始呢?我很困惑。然后((parms)=>({data1:j[objKey]:parms});在函数表示法的另一种形式中是这样的。然后(function(parms){return{data1:j[objKey]:parms}?在这种情况下,箭头函数的工作原理与普通函数完全相同(只是它们更简洁)数组的第二个参数。从
回调是map
函数,对于该函数,第一个值是正在迭代的元素的值(即undefined
),第二个值是正在迭代的元素的索引(这是有意义的,保持一个值0到limit-1
。因此,第一个参数被称为
,表示它不会被使用。我做j++
是为了模仿你正在做的事情-你也从开始(var j=1;j但如果可能的话,从0开始,不递增j
会更好。是的,后跟值的箭头函数意味着隐式返回值。(不能单独使用大括号,因为这样会将其解释为块而不是对象文字)我不知道从1开始。应该从1900开始。我希望能够输入一个年份范围;或者是一个特定的开始年份和结束年份,或者是一个特定的结束年份。我不太了解数组中发生了什么。from()谢谢,这是有道理的,但我还不理解函数的胖箭头形式。所以我现在用另一种方式来做,我现在更了解。为什么uin(j),j开始于1而不是0?我很困惑。然后((parms)=>({data1:j,[objKey]:parms}));在函数表示法的另一种形式中是.then(function(parms){return{data1:j[objKey]:parms}?在这种情况下,箭头函数的工作原理与普通函数完全相同(只是它们更简洁)数组的第二个参数。从
回调是map
函数,对于该函数,第一个值是正在迭代的元素的值(即undefined
),第二个值是正在迭代的元素的索引(这是有意义的,保持一个值0到limit-1
。因此,第一个参数被称为。
,表示它将不被使用。我做了j++