有没有一种方法可以将第一个promise链接到promise以通过id获取URL

时间:2019-05-17 09:01:15

标签: javascript node.js promise

我正在为dialogflow设置一个webhook,以使我的机器人可以访问我的mysql数据库中的数据。我已经使用了promises,一切都很好,但是它总是只返回一个包含数据的表,因此使用它非常简单。

我正在为dialogflow设置一个webhook,以使我的机器人可以访问我的mysql数据库中的数据。我已经使用了promises,一切都很好,但是它总是只返回一个包含数据的表,因此使用它非常简单。

现在,我做出了这样的承诺:将所有帖子的详细信息存储在一个表中,除了存储在其他位置的图片网址。我使用第一个承诺返回的ID做出了第二个承诺。我试图嵌套它们,但是它不起作用,我已经阅读了有关诺言链的信息,但是我不太了解它在我的情况下是如何工作的。

这是第一个根据这些参数返回一堆产品的承诺

function getRecommendationCallback(gender,type,size,color,priceMin,priceMax){
return new Promise((resolve,reject)=>{
    console.log('Inside getRecommendationCallback');
  try{
     mysqlConnection.connect((err)=>{
        if(!err){
            console.log('DB connection succeeded.');
            console.log('passed contextparameters : '+ gender + ' ' + type + ' '+size+ ' ' +color+ ' '+priceMin+' '+priceMax);
            mysqlConnection.query(`SELECT p.ID as product_id, p.post_title,p.post_name,p.guid,post_content, 
                                                    max( CASE WHEN pm.meta_key = 'product_gender' and p.ID = pm.post_id THEN pm.meta_value END ) as product_gender, 
                                                    max( CASE WHEN pm.meta_key = '_price' and p.ID = pm.post_id THEN pm.meta_value END ) as price, 
                                                    max( CASE WHEN pm.meta_key = 'product_color' and p.ID = pm.post_id THEN pm.meta_value END ) as product_color, 
                                                    max( CASE WHEN pm.meta_key = 'product_category' and p.ID = pm.post_id THEN pm.meta_value END ) as product_category,
                                                    max( CASE WHEN pm.meta_key = 'product_size' and p.ID = pm.post_id THEN pm.meta_value END ) as product_size
                                            FROM    
                                                wp_posts p 
                                                join wp_postmeta pm on p.ID = pm.post_id 
                                            group by 
                                                p.ID 
                                            HAVING 
                                                product_gender = ? AND product_category = ? AND price BETWEEN ? AND ? OR product_size = ? OR product_color = ?`,[gender,type,priceMin,priceMax,size,color],
             (error,rows,fields)=>{
                if(!error){
                    console.log(rows);

                    resolve(rows);
                    }
                else{
                    console.log(error);
                    reject(rows);
                    }
                });

        }
    else{
        console.log('DB connection failed.');
    }
 });

  }catch(err){
    let results = 'error in try-catch';
    console.log(results);
    reject(results);
  }
});
}

这是第二个承诺,使用第一个承诺中的postID作为参数

function getRecommendationUrlCallback(postId) {
  return new Promise((resolve, reject) => {
      console.log('Inside getImageUrlCallBack');
      try {
          mysqlConnection.connect((err) => {
              if (!err) {
                  console.log('DB connection succeeded.');
                  console.log('passed parameters postID: ' + postId);
                  mysqlConnection.query(`SELECT concat((select option_value from wp_options where option_name ='siteurl'  limit 1),'/wp-content/uploads/',childmeta.meta_value)                           as url
                                   FROM wp_postmeta childmeta 
                                   INNER JOIN wp_postmeta parentmeta ON (childmeta.post_id=parentmeta.meta_value)
                                   WHERE parentmeta.meta_key='_thumbnail_id' and childmeta.meta_key = '_wp_attached_file'
                                   AND parentmeta.post_id = ? ;`, [postId],
                      (error, rows, fields) => {
                          if (!error) {
                              console.log(rows);

                              resolve(rows);
                          } else {
                              console.log(error);
                              reject(rows);
                          }
                      });

              } else {
                  console.log('DB connection failed.');
              }
          });


      } catch (err) {
          let results = 'error in try-catch';
          console.log(results);
          reject(results);
      }


  });
  }

这就是我如何称呼它们,但是由于返回,所以它不起作用,因此被调用的Promise之后的所有内容都不会执行

function recommendation(agent){
    return getRecommendationCallback(genderContext, typeClothingContext, sizeContext, colorContext, priceMinContext, priceMaxContext).then((rows) => {
        if (rows.length > 0) {
    for (var i = 0; i < rows.length; i++) {
        //getProductUrl
                return getRecommendationUrlCallback(rows[i].id).then((row)=>{
                    if(row.length > 0)
                        const imgUrl = row[0].url;

                }).catch((error) => {
                    console.log('In catch ERROR::: ' + error);
                    agent.add('Unfortunately , we have problems on our side, please try again');
                });

                agent.add(new Card({
                    title: rows[i].post_title,
                    imageUrl: url,
                    text: rows[i].post_content,
                    buttonText: 'Shop now!',
                    buttonUrl: 'localhost:3000/MLAssist/?product=' + rows[i].post_name

                }));


            }
        } else {
            agent.add(`Unfortunately  we don't have exactly what you're looking for. But don't worry our shop has many other products you may like!`);
        }
    }).catch((error) => {
        agent.add('Unfortunately , we have problems on our side, please try again');
    });
}

很抱歉,如果很多,将不胜感激

0 个答案:

没有答案