Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确实施一个承诺。然后承诺_Javascript_Jquery_Promise - Fatal编程技术网

Javascript 如何正确实施一个承诺。然后承诺

Javascript 如何正确实施一个承诺。然后承诺,javascript,jquery,promise,Javascript,Jquery,Promise,我如何实现一个.then承诺,所以一旦这个函数运行,我就在数组中有了一些东西 我可以将结果记录到函数中,我相信它会正确返回结果,但是res.json结果将显示一个空数组。我认为这是因为它的加载速度比函数完成的速度快 const{grabArticles}=require('../controller/update.js'); //变数 const router=express.router(); router.get('/new',(err,res)=>{ 常量结果=[]; 常量测试=捕获物品

我如何实现一个.then承诺,所以一旦这个函数运行,我就在数组中有了一些东西

我可以将结果记录到函数中,我相信它会正确返回结果,但是res.json结果将显示一个空数组。我认为这是因为它的加载速度比函数完成的速度快

const{grabArticles}=require('../controller/update.js');
//变数
const router=express.router();
router.get('/new',(err,res)=>{
常量结果=[];
常量测试=捕获物品(结果)
测试。然后((结果)=>{
res.json(结果);
})

});
您需要返回一个
承诺
,然后解析
结果
results
的值将作为第一个参数传递给您的then回调

未经测试,但其外观如下:

//不同的文件
const request=require('request');
const cheerio=需要(“cheerio”);
grabArticles=(结果)=>{
//常量结果=[];
返回新承诺(函数(解析){
请求(“https://fivethirtyeight.com/,函数(错误、响应、html){
const$=cheerio.load(html);
对于(x=1;x<4;x++){
//i是当前循环编号,element=这是请求的当前数据
$(“#主功能-”+x.toString())。每个((i,元素)=>{
常量主题=$(元素).children('.post info').children('.topic').text().trim();
const title=$(元素).children('.post info').children('.trise meta').children('.trise meta content').children('h2.article title.entry title').text().trim();
//console.log('topic:'+topic+'\n'+'标题:'+title);
常量newArticle={
主题:主题,,
标题:标题
};
结果:推送(newArticle);
})
}
log('inside update.js'+结果);
//////////////////////////
///在这里解决承诺
///then()将被触发
//////////////////////////
决心(结果);
});
});

}
用这样的承诺重写你的文章

grabArticles = (results) => {
  return new Promise((resolve, reject) => {
    request("https://fivethirtyeight.com/", function(error, response, html) {
      const $ = cheerio.load(html);
      for (x=1; x<4; x++) {
        // i is the current loop number, element=this is the current data requested
        $('#home-feature-' + x.toString()).each((i, element) => {
          const topic = $(element).children('.post-info').children('.topic').text().trim();
          const title = $(element).children('.post-info').children('.tease-meta').children('.tease-meta-content').children('h2.article-title.entry-title').text().trim();
          // console.log('topic: ' + topic + '\n' + 'title: ' + title);
          const newArticle = {
            topic: topic,
            title: title
          };
          results.push(newArticle);
        })
      }
      console.log('inside update.js' + results);
      // return result using resolve, otherwise using reject(error) to reflect something wrong
      resolve(results);
    });
  });
}
grabArticles=(结果)=>{
返回新承诺((解决、拒绝)=>{
请求(“https://fivethirtyeight.com/,函数(错误、响应、html){
const$=cheerio.load(html);
对于(x=1;x{
常量主题=$(元素).children('.post info').children('.topic').text().trim();
const title=$(元素).children('.post info').children('.trise meta').children('.trise meta content').children('h2.article title.entry title').text().trim();
//console.log('topic:'+topic+'\n'+'标题:'+title);
常量newArticle={
主题:主题,,
标题:标题
};
结果:推送(newArticle);
})
}
log('inside update.js'+结果);
//使用resolve返回结果,否则使用reject(error)反映错误
决心(结果);
});
});
}

您需要返回一个
Promise
而不是在我之后返回一个arrayrepeat“Promises不会使异步代码同步”。。。(Ͼ˳Ͽ)最好将所有
cheerio
处理放在
中,然后
回调处理异常,并且只将
请求
调用本身包装在
新承诺中