代码之家  ›  专栏  ›  技术社区  ›  kittu

无法在javascript中解析内部承诺

  •  0
  • kittu  · 技术社区  · 6 年前

    无法解析或超出内部承诺,因此我可以将数据发送回客户端。

    代码:

    function getAmazonData(url, isRatings) {
        var parsedData;
        var ItemLookup;
        var ratingsURL;
    
        return new Promise(function (resolve, reject) {
    
            request(url, function (err, response, body) {
                if (err) return reject(err);
                parseXML(body, function (err, parsedData) {
                    if (err) return reject(err);
                    ItemLookup = parsedData['ItemLookupResponse'];
    
                    if (ItemLookup && ItemLookup.Items && ItemLookup.Items.length > 0) {
                        // Request Error
                        if (ItemLookup.Items[0].Request && ItemLookup.Items[0].Request.length > 0 && ItemLookup.Items[0].Request[0].Errors) {
                            return reject(ItemLookup.Items[0].Request[0].Errors);
                        } else if (ItemLookup.Items[0].Item) {
                            ratingsURL = ItemLookup.Items[0].Item[0].CustomerReviews[0].IFrameURL[0];
                            if (isRatings) {
                                console.log('getting ratings...');
                                return new Promise(function (resolve2, reject2) {
                                    request(ratingsURL, { json: true }, function (ratingsError, ratingBody) {
                                        if (ratingsError) {
                                            return reject2('Error in getting ratings');
                                        }
                                        ItemLookup.Items[0].Item[0].CustomerReviews.push({ Ratings: ratingBody });
                                        resolve2(ItemLookup.Items[0].Item[0].CustomerReviews);
                                    });
                                });
                            }
                            console.log('Resolved: ', ItemLookup.Items[0].Item);
                            resolve(ItemLookup.Items[0].Item);
                        }
                    }
                });
            });
        });
    }
    
    amazon_router.get('/getDetails', function (req, res, next) {
        var amazonApi = decodeURIComponent(req.query.url);
        var amzonApiUrl = amazonApi.replace(/\+/g, '%2B');
        var isRatings = decodeURIComponent(req.query.ratings);
        console.log('');
        console.log('amazon api url ', amzonApiUrl);
        console.log('');
    
        getAmazonData(amzonApiUrl, isRatings).then(function (err, response) {
            if (err) res.send(err);
            res.send(response);
        });
    });
    

    在第10行解决了承诺后,数据永远不会发送: res.send(response); 内心的承诺有点不对劲,但我不确定我能不能解决它?

    2 回复  |  直到 6 年前
        1
  •  1
  •   m1ch4ls    6 年前

    看起来你是在混合回调和承诺。我建议把所有的电话都打包成承诺。

    从外表上看,你不需要内心的承诺,因为 request 需要回调,以便可以轻松解析外部回调。

    你也有一些分支 if 不调用resolve或reject的语句(在下面的代码中用注释标记)。您必须在所有分支中调用resolve/reject,否则承诺在遇到分支时“可能什么也不会做”。

    function getAmazonData(url, isRatings) {
      var parsedData;
      var ItemLookup;
      var ratingsURL;
    
      return new Promise(function (resolve, reject) {
        request(url, function (err, response, body) {
          if (err) return reject(err);
          parseXML(body, function (err, parsedData) {
            if (err) return reject(err);
            ItemLookup = parsedData['ItemLookupResponse'];
    
            if (ItemLookup && ItemLookup.Items && ItemLookup.Items.length > 0) {
              // Request Error
              if (ItemLookup.Items[0].Request && ItemLookup.Items[0].Request.length > 0 && ItemLookup.Items[0].Request[0].Errors) {
                reject(ItemLookup.Items[0].Request[0].Errors);
              } else if (ItemLookup.Items[0].Item) {
                ratingsURL = ItemLookup.Items[0].Item[0].CustomerReviews[0].IFrameURL[0];
                if (isRatings) {
                  console.log('getting ratings...');
                  request(ratingsURL, { json: true }, function (ratingsError, ratingBody) {
                    if (ratingsError) {
                      reject(new Error('Error in getting ratings'));
                      return;
                    }
                    ItemLookup.Items[0].Item[0].CustomerReviews.push({ Ratings: ratingBody });
                    resolve(ItemLookup.Items[0].Item[0].CustomerReviews);
                  });
                } else {
                  console.log('Resolved: ', ItemLookup.Items[0].Item);
                  resolve(ItemLookup.Items[0].Item);
                }
              } else {
                // resolve or reject here
              }
            } else {
              // resolve or reject here
            }
          });
        });
      });
    }
    

    包装电话承诺:

    function requestAsPromised(url) {
      return new Promise(function (resolve, reject) {
        request(url, function (err, response, body) {
          if (err) {
            reject(err);
          } else {
            resolve(body)
          }
        });
      })
    }
    
        2
  •  0
  •   Kamalakannan J    6 年前

    你需要使用 return 为了回报内心的承诺,

    function getAmazonData(url, isRatings) {
        var parsedData;
        var ItemLookup;
        var ratingsURL;
    
        return new Promise(function (resolve, reject) {
            return request(url, function (err, response, body) {
                if (err) return reject(err);
                return parseXML(body, function (err, parsedData) {
                    if (err) return reject(err);
                    ItemLookup = parsedData['ItemLookupResponse'];
    
                    if (ItemLookup && ItemLookup.Items && ItemLookup.Items.length > 0) {
                        // Request Error
                        if (ItemLookup.Items[0].Request && ItemLookup.Items[0].Request.length > 0 && ItemLookup.Items[0].Request[0].Errors) {
                            return reject(ItemLookup.Items[0].Request[0].Errors);
                        } else if (ItemLookup.Items[0].Item) {
                            ratingsURL = ItemLookup.Items[0].Item[0].CustomerReviews[0].IFrameURL[0];
                            if (isRatings) {
                                console.log('getting ratings...');
                                return new Promise(function (resolve2, reject2) {
                                    request(ratingsURL, { json: true }, function (ratingsError, ratingBody) {
                                        if (ratingsError) {
                                            return reject2('Error in getting ratings');
                                        }
                                        ItemLookup.Items[0].Item[0].CustomerReviews.push({ Ratings: ratingBody });
                                        resolve2(ItemLookup.Items[0].Item[0].CustomerReviews);
                                    });
                                });
                            }
                            console.log('Resolved: ', ItemLookup.Items[0].Item);
                            return resolve(ItemLookup.Items[0].Item);
                        }
                    }
                });
            });
        });
    }
    

    因为它看起来像Node.js代码,所以尝试使用 async/await